使用express+mongoDB搭建多人博客 学习(3)connect-flash和mongodb,表单注册
1、根目录下新建settings.js,存放数据库配置
module.exports={ cookieSecret:"myblog", db:"blog", host:"localhost" };
2、根目录下新建models文件夹,在models文件夹下新建db.js
var settings=require("../settings"), Db=require('mongodb').Db, Connection=require('mongodb').Connection, Server=require('mongodb').Server; module.exports=new Db(settings.db,new Server(settings.host,Connection.DEFAULT_PORT),{safe:true});
3、安装express-session、mongodb与connect-mongo
4、修改app.js文件:
增加:
var session = require('express-session'); vr MongoStore = require('connect-mongo')(session); var settings=require("./settings");
app.use(session({ secret: 'settings.cookieSecret', key:settings.db, cookie:{maxAge:1000*60*60*24*30},//30 days store: new MongoStore({db:settings.db}) }));
5、安装connect-flash模块
npm install connect-flash --save
修改app.js:
var flash = require('connect-flash'); var session = require('express-session'); vr MongoStore = require('connect-mongo')(session); var settings=require("./settings");
app.use(flash()); app.use(session({ secret: 'settings.cookieSecret', key:settings.db, cookie:{maxAge:1000*60*60*24*30},//30 days store: new MongoStore({db:settings.db}) })); app.use(function(req, res, next) { console.log("flash!"); res.locals.error = req.flash('error').toString(); next(); });
6、models文件夹下新建user.js
var mongodb=require('./db'); function User(user){ this.name=user.name; this.password=user.password; this.email=user.email; } module.exports=User; User.prototype.save=function(callback){ var user={ name:this.name, password:this.password, email:this.email }; mongodb.open(function(err,db){ if(err){ return callback(err); } db.collection("users",function(err,collection){ if(err){ mongodb.close(); return callback(err); } collection.insert(user,{ safe:true },function(err,user){ mongodb.close(); if(err){ return callback(err); } callback(null,user[0]); }); }); }); }; User.get=function(name,callback){ 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:name, },function(err,user){ mongodb.close(); if(err){ return callback(err); } callback(null,user); }); }); }); };
7、routes文件夹下index.js修改如下:
var express = require('express'); var router = express.Router(); var User=rireque("../models/user.js");
router.post('/reg',function(req,res,next){ var name=req.body.name, password=req.body.password, repassword=req.body.repassword; if(repassword!==password){ req.flash("error","两次输入的密码不一致"); return res.redirect("/reg"); } });
8、视图reg.ejs修改为:
<%- include header %> <% if(locals.error){ %> <span><%= locals.error %></span> <% } %> <form method="post"> 用户名:<input type="text" name="name"/><br/> 密码:<input type="password" name="password"/><br/> 确认密码:<input type="password" name="repassword"/><br/> 邮箱:<input type="email" name="email"/><br/> <input type="submit" value="注册"/> </form> <%- include footer %>
密码不一致时,效果如下:
9、routes文件夹下index.js修改如下:
var express = require('express'); var router = express.Router(); var crypto=require('crypto'); var User=require("../models/user.js");
router.post('/reg',function(req,res,next){ var name=req.body.name, password=req.body.password, repassword=req.body.repassword; if(repassword!==password){ req.flash("error","两次输入的密码不一致"); return res.redirect("/reg"); } var md5=crypto.createHash('md5'); password=md5.update(req.body.password).digest('hex'); var newUser=new User({ name:req.body.name, password:password, email:req.body.email }); User.get(newUser.name,function(err,user){ if(user){ req.flash('error',"用户名已存在"); return res.redirect("/reg"); } newUser.save(function(err,user){ if(err){ req.flash("error",err); return res.redirect("/reg"); } req.session.user=user; req.flash("success","注册成功"); res.redirect("/"); }); }); });
app.js修改:
app.use(function(req, res, next) { res.locals.error = req.flash('error').toString(); res.locals.success = req.flash('success').toString(); next(); });
views文件夹中的index.ejs修改:
<%- include header %> 这是主页 <% if(locals.success){ %> <span><%= locals.success %></span> <% } %> <%- include footer%>
注册成功后显示:
用户名已存在时:
hi,我的新博客地址:ysha.me !!