学习《Node.js入门指南》中的微博案例,折腾了好久,总算可以运行了,在这里将Node.JS的Mongodb中用法抽离出来,以备后用。
1、首先将Mongodb框架安装到项目中。使用的版本为:
"mongodb": "*",
"connect-mongo":"*",
2、定义一个setting.js文件用于保存Mongodb的一些配置信息
module.exports={
cookieSecret: 'microblogxiao',//用于加密可以随便定义
db: 'myblog', //数据库名
host: 'localhost' //本地服务器
}
3、定义一个models/db.js功能是专门用于连接Mongodb
var settings = require('../setting'); //将setting.js加载进来
var Db = require('mongodb').Db; //用于操作数据库
var Connection = require('mongodb').Connection; //连接数据库
var Server = require('mongodb').Server; //启动一个数据库服务
//建立一个连接数据库对象,通过module.exports将该对象设置为外部可引用。
module.exports = new Db(settings.db,new Server(settings.host,Connection.DEFAULT_PORT,{}),{safe:true});
4、定义操作方法user.js
/**
* Created by kevin on 2015/1/15.
*/
var mongodb = require('./db'); //加载数据库连接操作对象的类
var util = require('util');
function User(user) { //初始化对象,传入2个参数
this.name = user.name;
this.password = user.password;
};
User.prototype.save = function save(callback) { //定义一个原型方法,User继承该方法。用于保存数据
var user = {
name: this.name,
password: this.password
};
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
// collection.ensureIndex('name', {unique: true});
console.log("user=="+util.inspect(user));
collection.insert(user,{safe: true}, function (err, user) {
mongodb.close();
callback(err, user);
});
});
});
}
//查询用户
User.get = function get(username, callback) {
console.log("username=" + username);
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
collection.findOne({name: username}, function (err, doc) {
mongodb.close();
console.log("doc="+util.inspect(doc));
if (doc) {
var user = new User(doc);
console.log("user=="+util.inspect(user));
callback(err, user);
} else {
callback(err, null);
}
});
});
});
};
module.exports = User;
5、使用数据操作方法在入口程序中或路由中。(将注册信息存入数据库中)
router.post('/reg', checkNotLogin);
router.post('/reg', function (req, res) {
if (req.body['password-repeat'] != req.body['password']) {
req.flash('error', "两次输入的口令不一致");
return res.redirect('/reg');
}
console.log(req.body.username);
var md5 = crypto.createHash('md5');
var password = md5.update(req.body.password).digest('base64');
var user = {
name: req.body.username,
password: password
}
var newUser = new User(user); //获得User对象,并将注册信息传入
//检查用户名是否已经存在
User.get(newUser.name, function (err, user) {
console.log("xx=" + newUser.name);
if (user)
err = 'Username already exists.';
if (err) {
req.flash('error', err);
return res.redirect('/reg');
}
newUser.save(function (err) {
if (err) {
req.flash('error', err);
return res.redirect('/reg');
}
req.session.user = newUser;
req.flash('success', '注册成功');
res.redirect('/');
});
});
});