当前位置: 首页 > news >正文

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,再跑一遍所有流程,通了。

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

  欲知后事...

 

转载于:https://www.cnblogs.com/fu277/p/6723421.html

相关文章:

  • VMware NAT模式
  • 无锡换社保卡的流程(旧社保卡在手上)
  • vim安装
  • iOS 中 iBeacon 开发
  • Kali-linux控制Meterpreter
  • HTTP响应状态码
  • 开源中文分词工具探析(六):Stanford CoreNLP
  • 用脚本模式配置数据同步
  • 如何在ubuntu16上安装docker
  • saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
  • 边车容器下的服务网格istio
  • Git基本
  • 【个人向】《HTTP图解》阅后小结
  • complexType
  • JAVA利用HttpClient进行POST请求(HTTPS)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CentOS7简单部署NFS
  • CentOS从零开始部署Nodejs项目
  • Java 多线程编程之:notify 和 wait 用法
  • java 多线程基础, 我觉得还是有必要看看的
  • leetcode386. Lexicographical Numbers
  • mysql外键的使用
  • node入门
  • ucore操作系统实验笔记 - 重新理解中断
  • vue学习系列(二)vue-cli
  • 阿里云购买磁盘后挂载
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 排序算法学习笔记
  • 深度解析利用ES6进行Promise封装总结
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 进程与线程(三)——进程/线程间通信
  • #pragma once与条件编译
  • (1)常见O(n^2)排序算法解析
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (论文阅读40-45)图像描述1
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)C#调用WebService 基础
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Core中的去虚
  • .net wcf memory gates checking failed
  • .NET 发展历程
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net经典笔试题