• Node.js + Express 4.x + MongoDB 构建登录注册(二)


      上回的“登录”基本完成,可是login和home拿到的对象是两个user对象。

      为此祭出大招session。

      PS:只展示与改动有关的代码,其他代码不变,故省略...

    一、安装、配置session

      “命令提示符”执行:npm install express-session

      安装完了,还需要配置,打开“app.js”文件:

    //新增,跟在一大堆require后面即可
    const session=require('express-session');
    
    //然后在该位置配置session
    var app = express();
    
    app.use(session({
        secret:'secret',
        cookie:{maxAge:1000*60*30},  //30分钟
        resave:false,
        saveUninitialized:true
    }));
    
    //登录以后,将user对象存入session,再交给response对象,用于页面显示
    app.use(function(req,res,next)
    {
        res.locals.user=req.session.user;
        next();
    });

    二、修改“登录”

      打开“index.js”:

    //修改login路由
    router.route('/login').get(function(req,res)
    {
        res.render('login',{title:'Login'});
    }).post(function(req,res)
    {
        //因为还没有连接数据库,数据还是假的
        let user={username:'admin',password:'123'};
        if(req.body.username==user.username&&req.body.password==user.password)
        {
            req.session.user=user;  //将user对象存入session
            return res.redirect('home');
        }
        else
        {
            return res.redirect('login');
        }
    });
    
    //修改home路由,去掉声明user对象和向页面传递对象
    router.get('/home',function(req,res)
    {
        return res.render('Home',{title:'Home'});
    });
    
    //修改logout路由,注销时,清空session
    router.get('/logout',function(req,res)
    {
        req.session.user=null;
        return res.redirect('/');
    });

      再刷新index.html页面,会发现“登录”流程和原来没有区别。

      对,感官上没有区别,但是后面将user对象存入session,这时,login和home共用同一个user对象。

      也暴露了问题。

    三、拦截

      问题一:在没有登录的状态,手动输入地址:“http://localhost:3000/home”  页面会报500错,home页面的<%=user.username%>无法取到值,因为没有登录,req.session.user是空的,转而res.locals.user也是空的。

      问题二:在登录状态(不注销),手动输入地址:“http://localhost:3000/login” 页面还是在登录,用户已经登录了,不应该还要登录。

      问题三:没有错误提示,比如密码输错了。

      为了解决这两个问题,我们需要拦截请求加以判断。

      解决问题一、二,打开index.js:

    //all()响应所有请求,get()响应get请求,post()响应post请求
    //最后的next()一定要有
    //将错误提示信息存入session
    router.route('/login').all(function(req,res,next)
    {
        if(req.session.user)
        {
            req.session.error="您已登录!";
            return res.redirect('home');
        }
        next();
    }).get(function(req,res)
    {
        res.render('login',{title:'Login'});
    }).post(function(req,res)
    {
        //因为还没有连接数据库,数据还是假的
        let user={username:'admin',password:'123'};
        if(req.body.username==user.username&&req.body.password==user.password)
        {
            req.session.user=user;  //将user对象存入session
            return res.redirect('home');
        }
        else
        {
            req.session.error='用户名或者密码错误!';
            return res.redirect('login');
        }
    });
    
    //登录通过以后,进入Home页面
    router.route('/home').all(function(req,res,next)
    {
        if(!req.session.user)
        {
            req.session.error='请先登录!';
            return res.redirect('login');
        }
        next();
    }).get(function(req,res)
    {
        return res.render('Home',{title:'Home'});
    });

      问题一、二解决了,问题三的错误信息也存入了session,现在要在页面显示出来,先修改app.js里面关于session配置的代码:

    app.use(function(req,res,next)
    {
        res.locals.user=req.session.user;
        let err=req.session.error;
        delete req.session.error;
        res.locals.message='';
        if(err)
        {
            res.locals.message='<div class="fuzq_message">'+err+'</div>';
        }
        next();
    });

      错误提示信息代码已经准备好,就差前端显示了,分别打开login.html和home.html:

      (PS:两个页面,我都是加在h1标签上面,大家随意。)

    <%- message %>
    <h1><%= title %></h1>

      保存,刷新index.html,再跑一遍所有流程,通了。

      “登录”还是基本完成,因为数据还是假的,是在路由器中生成的。

      欲知后事...

  • 相关阅读:
    bootstrap在线引用 bootstrap百度调用
    CentOS7下安装MySQL5.7安装与配置(YUM)
    screen命令的常见用法
    Nginx主要用来干什么
    linux-Centos7安装python3并与python2共存
    爬虫小问题之以为是编码问题,却是headers中参数问题
    LabWindows/CVI基础
    STM32 命名方法
    Ubuntu14.04虚拟机下基本操作(typical安装)
    网关,路由器,交换机,猫小结
  • 原文地址:https://www.cnblogs.com/fu277/p/6723421.html
Copyright © 2020-2023  润新知