天天看点

mongodb(mongoose)+express(nodejs)搭建web应用使用mongodb(mongoose)+express(nodejs)搭建web应用

使用mongodb(mongoose)+express(nodejs)搭建web应用

安装好nodejs,mongodb,具体方法请自行搜索(mac osx 使用 homebrew安装mongodb后,一些小问题的解决方案)

mongoose的好处:防止在大量并发的情况下出错;让nodejs更容易操作mongodb数据库。最大的特色就是对象模型。

开始

在确认已经安装了node之后(下载), 在你的机器上创建一个目录

$ mkdir hello-world
           

在这个目录中创建一个package.json文件, 这个文件是你整个程序的一个简介,其中最重要的是 

dependencise

,它确定你的这个应用依赖哪些包,以便下载。版本号根据自己下载的版本修改,防止将来版本更新导致无法正确运行。—— `~'代表接近的版本号,'>='表示大于等于的版本号,其他<=符号都通用

{
    "name": "hello-world",
    "description": "hello world test app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "express": "~4.12.0",
        "mongoose": "~3.8.24",
        "ejs": "~2.3.1",
        "body-parser": "~1.12.0",
    }
}
           

进入package.json的目录,运行

$ npm install
           

当npm完成后,你的应用所需的依赖就安装到你的 ./node_modules 目录里了。

设置首页

创建一个名为app.js的文件

//实例化一个express对象以供使用
var express = require('express');
var app = express();

//当使用get方法获取'/'地址的时候,返回helloword。这里req是从客户端发送到服务端的请求对象,res是服务端的响应对象,req和res的具体使用方法,请到express官方api文档了解http://expressjs.jser.us/
app.get('/', function(req, res){
    res.send('Hello World');
});

//监听3000端口
var server = app.listen(, function() {
    console.log('Listening on port %d', server.address().port);
});
           

下面运行app.js

$ node app.js
           

打开你的浏览器,输入http://localhost:3000,helloworld就出现了

如何提交表单并向数据库插入数据?

通过mongoose与数据库建立连接

创建一个名为mongo.js的文件

var mongoose = require('mongoose'),
//mongoose.connect(uri, options); uri的更多格式请查看mongoose官方api文档http://mongoosejs.com/docs/api.html#index_Mongoose-connect

var db = mongoose.connect('mongodb://localhost:27017/test').connection;

//一旦建立连接,则会触发
db.on('connected', function () {
    console.log('Mongoose connected to ' + uri);
});
//一旦该连接发生错误,则会触发
db.on('error',function (err) {
  console.log('Mongoose connection error: ' + err);
});
//一旦该连接被关闭,则会触发
db.on('disconnected', function () {
  console.log('Mongoose disconnected');
});

module.exports = mongoose;
           

关于建立超过两个数据库的连接方法 即 mongoose.connect 和 mongoose.creatConnection的区别。

connect和createConnection都能 连接mongodb数据库,支持以URI或参数(host,database,port)的形式。

var mongoose = require('mongoose');  
mongoose .connect('mongodb://www.csser.com/csser.com_database');
           

连接一旦建立成功,该连接实例的open事件就被触发。如果你使用的是mongoose.connect方式,连接对象为mongoose.connection;否则,mongoose.createConnection返回的是Connection对象。

如果你打开一个单独的连接使用mongoose.createConnection(), 但试图访问模型mongoose.model(“ModelName '),则不能按预期工作,因为它不是连接到一个活跃的数据库连接。

在这种情况下通过创建的连接访问您的模型(是可以成功的):

var conn = mongoose.createConnection('your connection string'), 
    MyModel = conn.model('ModelName', schema), 
    m = new MyModel;
m.save(); // works
           

下面这种是错误的:

var conn = mongoose.createConnection('your connection string'), 
    MyModel = mongoose.model('ModelName', schema),
    m = new MyModel;
m.save();   //doesn't work
           

model层——通过mongoose设置好数据的Schema

Schema是什么?就是MVC架构中的M——model。看看具体代码也许你就能明白了

设置好Schema后,就可以很方便的往数据库中插入信息了 创建一个名为userModel.js的文件,这是一个社交网站的用户信息

var mongoose = require('./mongo'),
Schema = mongoose.Schema;

//每个用户都一个好友列表
//Schema的定义中,可以初始化一些选项,在options的字段中:
//`_id` :默认为true,是否自动生成主键,是存入mongodb中的id,确保数据的唯一性。当某个Schema只是嵌入别的Schema中而不需要单独存入mongodb的时候,可以设置为false。
//`collection`: 自定义存入数据库的collection的名字
var friendSchema = Schema({
    userid: Number,
    icon: {type:String,default:'default/heads/default.jpg'},
    nickname: String,
    remark: String,
    status: Number//0-正在验证中,1-成功成为好友,2-其他情况
}, {_id: false}), 

//会存入数据库的用户信息结构
userSchema = Schema({
    userid: Number,
    password: String,
    nickname: String,
    status: Number,//0-离线,1-在线,2-离开,3-隐身
    icon: {type:String,default:'default/heads/default.jpg'},
    email: String,
    add: Number,//0-随意加,1-需要认证消息,2-不允许任何人加
    birth: Date,
    gender: Number,//0-女,1-男,2-保密
    friends: [friendSchema],
    regtime: {type: Date, default: Date.now}
}, {collection: 'users', });

module.exports = mongoose.model('Users', userSchema)
           

control层——通过mongoose操作数据

创建一个名为userControl.js的文件,目的是为了定义 User的 插入函数

var mongoose = require('mongoose');
var User = require('./userModel');

var user = new User(),
    U = module.exports;

//将需要被保存的user对象传入,在调用save插入数据库,如果插入成功,控制台会输出刚刚插入的user对象
U.insert = function (user) {
    var u = new User(user);
    u.save(function (err, newUser) {
        if (err) return console.error(err);
        console.log(newUser);
    })
}
           

view层——web页面

创建一个名为 index.ejs 的文件 随意写一个表单用做测试,注意:input的name要和设置的Schema的字段相同

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
</head>
<body>
    <form action="/" method="post">
        <input type="text" value="444792006" name='userid'>
        <input type="text" value="123" name='password'>
        <button>submit</button>
    </form>
<script></script>
</body>
</html>
           

最后就是服务端的一些设置和路由

创建一个名为 app.js 的文件

//bodyParser是用来解析post的请求体的,属于express的一部分,但是需要另外引入
var mongoose  = require('./mongo'),
    User = require('./userControl'),
    express   = require('express'),
    ejs = require('ejs'),
    bodyParser = require('body-parser'),
    app       = express();

//设置view模板所在的目录
app.set('views',__dirname);
// 设置模板引擎,如果不设置没办法渲染,这里我们用的是ejs模版引擎
app.set('view engine', 'ejs');

app.use(bodyParser());

app.get('/',function(req, res){
    res.render('index')
});

app.post('/', function(req, res){
//执行插入操作
        User.insert(req.body);
});

var server = app.listen(, function() {
    console.log('Listening on port %d', server.address().port);
});
           

完成

运行app.js

$ node app.js
           

打开http://localhost:3000,提交表单,然后看看控制台是不是提交成功了

继续阅读