Node+Express+MongoDB实现登录注册功能实例
注入MongoDB依赖
varmongoose=require("mongoose");
由于需要进行表单处理,需要用到bodyParser中间件
bodyParser模块来做文件解析,将表单里的数据进行格式化
varbodyParser=require("body-parser"); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended:true}));
登录后将用户信息保存下来,需要使用session中间件,它依赖cookieParser中间件
varcookieParser=require('cookie-parser'); varsession=require('express-session'); armongoStore=require('connect-mongo')(session); vardbUrl='mongodb://localhost/express'; app.use(cookieParser()); app.use(session({ secret:'express', store:newmongoStore({ url:dbUrl, collection:'sessions' }) }));
使用jade模板
layout.jade
doctypehtml html head meta(charset='utf-8') title#{title} include./includes/head body include./includes/header blockcontent
head.jade
link(href='css/main.css',rel='stylesheet') link(href="/libs/bootstrap/dist/css/bootstrap.min.css"rel="externalnofollow",rel="stylesheet") script(src="/libs/jquery/dist/jquery.min.js") script(src="/libs/bootstrap/dist/js/bootstrap.min.js")
header.jade
.container .row .page-header h1#{title} .navbar.navbar-default.navbar-fixed-bottom .container ifuser p.navbar-text.navbar-right span欢迎你,#{user.name} span | a.navbar-link(href="/layout"rel="externalnofollow")退出登录 else p.navbar-text.navbar-right a.navbar-link(href="/signup"rel="externalnofollow",data-toggle="modal",data-target="#signupModal")注册 span | a.navbar-link(href="/login"rel="externalnofollow",data-toggle="modal",data-target="#signinModal")登录
signup.jade
include../layout blockcontent form.form-horizontal(role="form",method="POST",action='/user/signup') .form-group label.col-sm-2.control-label(for="signupName")用户名 .col-sm-10 input#signupName.form-control(type="text",name="user[name]",placeholder="输入用户名") .form-group label.col-sm-2.control-label(for="signuppassword")密码 .col-sm-10 input#signuppassword.form-control(type="password",name="user[password]",placeholder="输入密码") .form-group label.col-sm-2.control-label(for="signupemail")邮箱 .col-sm-10 input#signupemail.form-control(type="email",name="user[email]",placeholder="输入邮箱") .form-group .col-sm-offset-2.col-sm-10 button.btn.btn-default(type="submit")完成注册
配置路由
登录注册页面
//注册页面 app.get('/signup',function(req,res){ res.render('signup',{ title:'注册' }); }); //登录页面 app.get('/login',function(req,res){ res.render('login',{ title:'登录' }); });
注册功能
//注册表单 app.post('/user/signup',function(req,res){ var_user=req.body.user; User.findOne({name:_user.name},function(err,user){ if(err){ console.log(err); } if(user){ returnres.redirect('/login'); }else{ varuser=newUser(_user); user.save(function(err,user){ if(err){ console.log(err); res.redirect('/signup'); } console.log('注册成功——用户名:'+user); res.redirect('/login'); }); } }); });
登录功能
//登录表单 app.post('/user/login',function(req,res){ var_user=req.body.user; varname=_user.name; varpassword=_user.password; User.findOne({name:name},function(err,user){ if(err){ console.log(err); } if(!user){ returnres.redirect('/signup'); } user.comparePassword(password,function(err,isMatch){ if(err){ console.log(err); } if(isMatch){ req.session.user=user;//用户名存入session中 console.log('登录成功——用户名:'+user); returnres.redirect('/'); }else{ returnres.redirect('/lgoin'); } }); }); });
退出登录
app.get('/layout',function(req,res){ deletereq.session.user; //deleteapp.locals.user;//删除全局变量user,否则点击退出登录,页面无变化 res.redirect('/'); });
登录注册的数据库操作
连接数据库
mongoose.connect("mongodb://localhost/express");//连接数据库
schema模式定义
数据的更新和查找,以及密码加盐
//schemas/user.js varmongoose=require('mongoose'); varbcrypt=require('bcrypt'); varSALT_WORK_FSCTOR=10;//计算强度,越大破解越困难 varUserSchema=newmongoose.Schema({ name:{ unique:true, type:String }, password:String, email:String, meta:{ createAt:{ type:Date, default:Date.now() }, updateAt:{ type:Date, default:Date.now() } } }); //每次存入数据时都进行判断 UserSchema.pre('save',function(next){ varuser=this; if(this.isNew){//数据是新数据 this.meta.createAt=this.meta.updateAt=Date.now(); }else{ this.meta.updateAt=Date.now(); } //密码加盐 bcrypt.genSalt(SALT_WORK_FSCTOR,function(err,salt){ if(err){ returnnext(err); } bcrypt.hash(user.password,salt,function(err,hash){ if(err){ returnnext(err); } user.password=hash; next(); }); }); }); UserSchema.methods={ comparePassword:function(_password,cb){ bcrypt.compare(_password,this.password,function(err,isMatch){ if(err){ returncb(err); } cb(null,isMatch); }) } }; UserSchema.statics={ fetch:function(cb){ returnthis .find({}) .sort('meta.updateAt') .exec(cb); }, findById:function(id,cb){ returnthis .findOne({_id:id}) .exec(cb) } };
module.exports=UserSchema;
model编译模型
//models/user.js varmongoose=require('mongoose'); //模式 varUserSchema=require('../schemas/user'); //编译模型 varUser=mongoose.model('user',UserSchema); module.exports=User;
入口文件注入
//app.js varUser=require('./models/user'); app.set('viewengine','jade');//jade模板引擎 app.set("views","./views/pages/");//视图根目录 varserveStatic=require('serve-static');//静态文件处理 app.use(serveStatic('public'));//路径:public
身份验证中间件
获取session的用户名,存入到locals中,暴露给视图使用,即header.jade中可以获取到user。
app.use(function(req,res,next){ var_user=req.session.user; app.locals.user=_user; returnnext(); });
以上所述是小编给大家介绍的Node+Express+MongoDB实现登录注册功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!