当前位置: 首页 > 后端技术 > Node.js

express框架下使用session

时间:2023-04-03 20:03:16 Node.js

上一篇文章提到了cookies的缺点,提到使用session是解决缺点的一种方式。这次文章讲的是如何使用session。作者采用了将session保存在文件中的方法。如果使用其他存储方式(内存、数据库),记得使用相应的模块。下面分别介绍内存存储和文件存储的两种使用方法。内存存储session实现过程//app.js//引入express-sessionvarsession=require('express-session')//为应用绑定session中间件app.use(session({name:'session-id',secret:'12345-67890',saveUninitialized:false,resave:false}))查看结果router.get('/session/first',(req,res,next)=>{lets=req.sessionconsole.log(s)res.send(s)})用这个方法做一个demo。例如,显示浏览量。router.get('/session/view',(req,res,next)=>{lets=req.sessionif(req.session.views){req.session.views++res.send(`views:${req.session.views}time.`)}else{req.session.views=1res.send('views:0')}})文件存储session和内存存储session的区别在于保存的位置会议是不同的。内存存储方式是在session中保存session。对于占用大量内存的后台服务,这种方法肯定行不通。文件存储方式是将session保存在文件夹中。听说还有一种叫做数据库存储。安装要使用文件存储session,你需要安装session-file-store。npmiexpress-sessionsession-file-storeusefilestore//app.jsvarsession=require('express-session')varFileStore=require('session-file-store')(session)//导入//inexpress-session使用app.use(session({name:'session-id',secret:'12345-67890',saveUninitialized:false,resave:false,store:newFileStore()//表示使用文件存储}))注册、登录、登录验证和注销都需要bodyParsermongoose模块。记得安装。1.创建数据库连接。连接到数据库后,用户数据就可以放到数据库中了。//app.jsconstmongoose=require('mongoose')consturl='mongoodb://localhost:27017/confusion'constconnect=mongoose.connect(url,{useNewUrlParser:true,useCreateIndex:true})connest.then(db=>{console.log('Connectcorrecttoserver')},err=>{console.log(err)})2.创建用于连接到数据库的用户模型。在项目根目录下创建models目录,然后创建user.js。下面定义用户模型//@/models/user.jsvarmongoose=require('mongoose'),Schema=mongoose.Schema,User=newSchema({username:{type:String,required:true,unique:true},密码:{类型:字符串,需要:true},管理员:{类型:布尔值,默认值:false}})module.exports=mongoose.model('User',User)3.创建注册接口。注册的接口是否已经存在user------exists------>不要重复创建。|------------不存在----->创建用户//@/routes/users.js///session/first/session/view评论或删除。//该文件在app.user(session(...))之前,所以得不到req.session////查看session//router.get('/session/first',(req,res,next)=>{//lets=req.session//console.log(s)//res.send(s)//})////在session里保存浏览次数//router.get('/session/view',(req,res,next)=>{//lets=req.session//if(req.session.views){//req.session.views++//res.send(`views:${req.session.views}time.`)//}else{//req.session.views=1//res.send('views:1')//}//})router.post('/signup',(req,res,next)=>{console.log(req.body)User.findOne({username:req.body.username}).then(user=>{if(user===null){returnUser.create({username:req.body.username,password:req.body.password})}else{varerr=newError(`User${req.body.username}已经存在!`)err.status=403next(err)}}).then(user=>{res.statusCode=200res.json({status:'注册成功',user:user})}).catch(err=>{res.send(err)})})4.创建登录界面登录界面https://github.com/feigebaobei/nodejs/tree/master/node-session是否已经登录------登录------>donothing|----------未登录----->验证用户名/密码是否正确----正确---->设置已登录|-----------------------不正确---->返回错误router.post('/login',(req,res,next)=>{if(req.session.auth){//取req.session.authasFlag,flag是否已经通过登录认证res.statusCode=200res.send('你已经认证')}else{User.findOne({username:req.body.username}).then(user=>{if(user){if(user.password!==req.body.password){varerr=newError(`passworderror`)err.status=403next(err)}else{req.session.auth=true//将标志设置为true表示成功登录res.statusCode=200res.send('loginsuccessful')}}else{//指定用户没用varerr=newError(`User${req.body.username}不存在!`)err.status=403next(err)}//}).catch(err=>next(err))}).catch(err=>{res.send(err)})}})5.创建注销接口router.get('/logout',(req,res,next)=>{if(req.session){req.session.destroy()//删除会话res.clearCookie('session-id')//deletecookieres.send('注销成功,让前端做重定向')}else{varerr=newError('你没有登录!')err.status=403next(err)}})6.登录后才能访问的接口//@/routes/news.jsvarexpress=require('express');varrouter=express.Router();/*GET首页。*/router.get('/',function(req,res,next){res.render('index',{title:'Express'});});module.exports=router;7、编写登录验证中间件。注意登录界面、登录验证中间件、登录后才能访问的接口的先后顺序。//app.js//1.导入路由varindex=require('./routes/index');varusers=require('./routes/users');varnews=require('./routes/news');//2.挂载会话中间件app.use(session({name:'session-id',secret:'12345-67890',saveUninitialized:false,resave:false,store:newFileStore()}))//3.挂载不需要登录验证的路由app.use('/',index)app.use('/users',users)//4.定义验证登录函数letauthFn=(req,res,next)=>{console.log(req.session)if(req.session.auth){next()}else{varerr=newError('您未通过身份验证!')err.status=403next(err)}}//5.挂载路由app.use('/news',news)总结本例只讲解简单登录、验证登录、注销功能。以下是本文用到的js模块(express-session、session-file-store、mongoose)都可以在npm上找到。完整代码