學習《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('/');
});
});
});