之前的一篇文章《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