首页 > 代码库 > mongoose

mongoose

之前的一篇文章《mongodb+nodejs》是mongodb的native driver 来操作的,但是更成熟的方式应该使用mongoose,是代码更加简洁,更加安全。

这个例子和《mongodb+nodejs》中的例子一模一样,只是把 对mongodb操作语句,换成是mongoose的API,其他代码和文件完全一样。

代码如下:

var express = require('express');
var mongoose = require('mongoose');
var session = require('express-session');//之前是包括在express中,现在独立出来
var bodyParser = require('body-parser');//之前是包括在express 中,现在独立出来
var mongodb = require('mongodb');
var ObjectID = mongodb.ObjectID;//返回mongodb的_id一个结构,以便于查询

var app = express();
app.use(session(
	{secret:'my secret'
	,resave:false
	,saveUninitialized: true}
));
app.use(bodyParser.urlencoded({ extended: true }));//只有这里是true才能正确解析出user[first]之类的POST信息
app.use(bodyParser.json());//处理客户端传来的参数,并且存储在req.body.user中
app.use(express.static('views'));//防止客户端资源的文件夹
app.set('view engine','jade');//设置HTML解析引擎是jade
app.set('view options',{layout:false});

var Schema = mongoose.Schema;
var User = mongoose.model('User',new Schema({
	first:String
	,last:String
	,email:{type:String,unique:true}
	,password:{type:String,index:true}
}));

//db
//初始化服务器(地址、端口)
 mongoose.connect('mongodb://127.0.0.1/my-website');
 
 //自定义一个中间件,设置authenticated,和me(客户端文件会用到)
//注意,该自定义中间件,每个路径处理都会调用,且先调用
app.use(function(req,res,next){
	if(req.session.loggedIn){//登录id是否存在
		console.log('-------session logged' );
		res.locals.authenticated = true;//给客户端使用的
		
		console.log('req.session.loggedIn=' + req.session.loggedIn);
		console.log('typeof='+typeof(req.session.loggedIn));
		
		User.findById(req.session.loggedIn,function(err,doc){
			if(err){
				return next(err);
			}
			res.locals.me = doc;
			next();
		});
	}else {
		console.log('-------session not logged' );
		res.locals.authenticated = false;//未登录
		next();
	}
});
//获取主界面
app.get('/',function(req,res){
	console.log("------------/");
	res.render('index');
});
//获取登录界面
app.get('/login',function(req,res){
	console.log("------------login");
	res.render('login');
});
//提交登录信息
app.post('/login',function(req,res){
	console.log("------------login post");
	console.log("req.body.user:");
	console.log(req.body.user);
	//查找用户
	User.findOne({email:req.body.user.email,password:req.body.user.password},
	function(err,doc){
		if(err)
			return next(err);
		if(!doc)
			return res.send('<p>User not found.Go back and try again');
		req.session.loggedIn = doc._id.toString();
		res.redirect('/');
	});
});
//获取注册页面
app.get('/signup',function(req,res){
	console.log("------------signup");
	res.render('signup');
});
//提交注册信息
app.post('/signup',function(req,res,next){
	console.log("------------signup post");
	console.log(req.body.user);
	//插入注册数据
	var user = new User(req.body.user);
	user.save(function(err){
		if(err)
			return next(err);
		res.redirect('/login/' + user.email);
	});
});
//获取带参数的登录页面
app.get('/login/:signupEmail',function(req,res){
	console.log('----------/login/:signupEmail:');
	console.log(req.params.signupEmail);
	//登录页面,设置参数给客户端文件调用
	res.render('login',{signupEmail:req.params.signupEmail});
});
//获取退出页面
app.get('/logout',function(req,res){
	console.log("------------logout");
	req.session.loggedIn = null;
	//返回主界面
	res.redirect('/');
});
 
//监听
app.listen(3000,function(){
	console.log('\033[96m +  \033[39m app listening on *:3000');
});
	



参考:《了不起的nodejs》

mongoose