之前的一篇文章《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》
原文:http://blog.csdn.net/konglingbin66/article/details/42155437