使用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%>

注册成功后显示:

用户名已存在时:

原文地址:https://www.cnblogs.com/qianlegeqian/p/4250640.html