zoukankan      html  css  js  c++  java
  • 使用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%>

    注册成功后显示:

    用户名已存在时:

  • 相关阅读:
    QTP自动化测试进阶
    疯狂Java实战演义
    软件开发之韵:和谐敏捷
    Android应用开发详解
    操作系统直接决定了计算机系统的整体性能
    iBATIS框架源码剖析
    PHP 5完全攻略
    天气地图系统
    OpenSolaris系统管理
    Asp.net MVC 3实例学习之ExtShop(三)——完成首页
  • 原文地址:https://www.cnblogs.com/qianlegeqian/p/4250640.html
Copyright © 2011-2022 走看看