基于node.js使用express和session实现登录状态的保存

因为http是无状态的,所以在网页中输入的数据如果没有保存到数据库当中,一旦刷新页面就会变回原来的样子,所以用户的登录状态需要使用cookie,session或者token来保存。本篇文章就使用node.js
来设置session来实现登录状态的保存

文章当中涉及express和MongoDB的操作
express基础知识:https://blog.csdn.net/ziyue13/article/details/114716481
node.js操作MySQL:https://blog.csdn.net/ziyue13/article/details/115731143
node.js操作MongoDB:https://blog.csdn.net/ziyue13/article/details/113819566

//引入express框架
const express = require('express');
//使用express开启一个服务器
const app = express();
//引入path,拼接文件的路径
const path=require('path');
//引入body-parser,接收post请求参数
const bodyParser = require('body-parser');
//引入express-session,设置session
const session = require('express-session');
//设置session的秘钥
app.use(session({secret:'key'}));
//引入mongoose模块,操作MongoDB数据库
const mongoose = require('mongoose');
//设置post请求参数
app.use(bodyParser.urlencoded({extended:false}));
//引入模板引擎,并且设置模板引擎的路径
app.set('views',path.join(__dirname,'views'));
app.set('view engine','art');
app.engine('art',require('express-art-template'));
//开放静态资源访问
app.use(express.static(path.join(__dirname,'views')));

//连接数据库
mongoose.connect('mongodb://localhost/app',{useUnifiedTopology: true,useNewUrlParser: true,useCreateIndex: true})
	.then(()=>console.log('数据库连接成功'))
	.catch(err=>console.log('数据库连接失败'));
//创建数据规则
const userSchema = new mongoose.Schema({
	username:{
		type:String,
		//必填字段
		required:true,
		minlength:2,
		maxlength:20
	},
	password:{
		type:String,
		//必填字段
		required:true,
		minlength:2,
		maxlength:20
	},
});
//保存到mongoose数据库当中
const User = mongoose.model('User',userSchema);
//数据库SQL代码
/*
User.create({
	username:'admin',
	password:'admin',
}).then(()=>{
	console.log('用户创建成功');
}).catch(()=>{
	console.log('用户创建失败');
})
*/



//get路径访问登录页面
app.get('/login',(req,res)=>{
	res.render('denglu/denglu');
});
//点击按钮发送post请求
app.post('/login',async(req,res)=>{
	//console.log('接收到post请求方式');
	console.log(req.body);
	//接收请求参数
	const { username,password } = req.body;
	
	//先使用js判断当前的表单是否符合校验规则
	if(username.trim().length == 0||password.trim().length == 0){
		//console.log('输入的邮件或者密码为空');
		return res.status(400).send('<h4>邮件地址或者密码错误</h4>');
	}else{
		//console.log('输入的邮件或者密码不为空');
		//根据邮箱地址查询用户信息
		//如果查询到了用户user变量的值是对象类型,如果没有查询到用户,user变量为空
		//对象中储存的是用户信息
		let user = await User.findOne({username});
		//查询到用户
		if(user){
			//console.log('查询到对应的用户');
			if(password == user.password){
				console.log('密码一样,登录成功');
				//设置session属性
				req.session.flag=1;
				//把用户数据保存在req.app.locals全局对象下面
				req.app.locals.userInfo=user;
				res.redirect('/button');
			}else{
			    
				res.send('404');
			}
		}else{
			console.log('没有查询到对应的用户');
			//没有查询到用户
			res.send('404');
		}	
		
		
		
}

});
//访问button页面
app.get('/button',(req,res)=>{
	//判断用户是否登录,没有登录就重定向到登录页面
    if(req.session.flag&&req.session.flag==1){
        res.render('index');
    }
	else{
	    res.render('denglu/denglu');
	}
})

//监听4000端口号
app.listen(4000);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值