再走Node路(篇五): express && koa 脚手架项目上配置session

17 篇文章 4 订阅

昨日我们说到了如何使用原生的nodejs实现cookie + session + redis制作登录验证,但原生实现起来毕竟太过于麻烦,而现在的node项目又多是基于express和koa框架开发的,所以我们今天就来说一下如何在express 和 koa 脚手架创建的项目中配置使用session实现登录验证

  • 既然我们这里使用了express 和 koa 的脚手架创建项目,所以我们也有必要简单说一下他们的中间件机制和洋葱模型:
    关于中间件,我对他的理解是: 它就好比是一调流水线,将整个node项目串联起来,当请求到来时,express 或者 koa 将请求抽离成一个request 和一个 response对象,然后在项目中传递,所以我们之前说到的express中的参数存在一个req 和 一个res, 除此之外还有一个next()参数,就与我们的洋葱模型有关了:
    在这里插入图片描述
    我们就以这张图为例, 没个中间件就是一个函数,当http请求到达时,从外层的函数开始,一层一层的往内层函数去执行,就好比是剥洋葱一样,一层一层往往里剥,直到指定到最里层后再一层一层的往外面执行返回出去。而这整个的流程就是使用next()的这个函数来串联起来的,举个简单的例子:
const express = require('express')
const app = express()
app.use((req, res, next) => {
	console.log("请求到达,开始执行!")
	next()
})
app.use("/api", (req, res, next) => {
	console.log("进入到/api下,继续执行!")
	next()
})
app.get("/api/login", (req, res, next) => {
	console.log("路径:", req.url, "\n请求方式:", req.method, "结束" )
	res.end("ok")
})
app.listen(3000)
  • 我们执行以上代码后访问 localhost:3000/api/login 借口时,我们便可以得到以下的结果:
    在这里插入图片描述

经过上面我们的中间件机制,我们只需要往express和koa脚手架项目中再引入处理session的中间件即可:

  1. express中处理session的中间件及其配置:
  • 在express中我们使用express-session进行session 的配置,使用connect-redis对session和redis进行连接:
    1. 安装express-session 和 connect-redis : npm i express-session connect-redis --save
    2. 在脚手架的入口文件app.js文件中引入该插件:
const session = require('express-session)
const RedisStore = require('connect-redis')(session)
		  3. 使用redis插件创建redis客户端:
const redis = require('redis')

const conf = {
    port: 6379,
    host: "127.0.0.1"
}
const redisClient = redis.createClient(conf.port, conf.host)
redisClient.on('error', (err) => {
    console.log(err)
})

module.exports = redisClient
		  4. 引入redis客户端连接, 配置session中间件:
const redisClient = require('./db/redis')
const sessionStore = new RedisStore({   // 实例化一个redisStore()作为session的存储
  client: redisClient     // 指定store为redis存储客户端
})
// express注册使用session中间件: 配置后每次使用http请求后就会有了这么一个session值
app.use(session({
  secret: "CGX_#1084_",  // session 加密的密匙
  cookie: {    // cookie的配置
    path: '/',      // cookie 的生效路径: 默认配置
    httpOnly: true,    // 限制客户端操作修改cookie值 : 默认配置
    maxAge: 24 * 60 * 60 * 1000     // cookie的失效时间,这里设置为1天
  },
  store: sessionStore       //sesison存储的store
}))
  • 经过上述步骤的处理后,express-session便在执行后会往http请求的返回中写入cookie中一段connect.sid值,值是用我们的密匙经过express-session加密后的,同时我们也可以在路由中从req.session中获取到redis中存储的session的具体值以及设置session的值。 这样我们也就能够根据session值进行登录验证了,其原理实质还是和我们昨天使用原生的node实现的是产不多的.
  1. koa中处理session的中间件及其配置:
  • 在koa中我们配置处理session以及连接redis是使用koa-generic-session 和 koa-redis实现的:
    1. 项目中安装插件: npm i koa-generic-session koa-redis --save
    2. 在app.js文件中移入该插件:
const session = require('koa-generic-session')
const redisStore = require('koa-redis')
	3. 进行session配置:
// session配置
app.keys = ['CGX_#1084_']    // 类似于express中的secret,对session进行加密的密匙
app.use(session({
  // 配置cookie
  cookie: {
    path: "/",
    httpOnly: true,
    maxAge: 24 * 60 * 60 * 1000
  },
  // 配置redis
  store: redisStore({
    all: '127.0.0.1:6379'   // redis的端口配置: 在koa中直接在这里了store配置后就不用再做其他的redis客户端配置了,相比于express koa中显得可能也就更方便些
  })
}))
  • 由于在koa中没有将req和res拆分开来,而是都放到了ctx中,所以我们拿到session值可以使用ctx.session拿到我们的redis中存放的session值以及修改session值,这也就完成了koa中的登录验证了.

经过五天的node路,简单的node服务器搭建我们现在是有能力实现的了,但对于更多的复杂的逻辑操作还需要我们继续不断的深究。
之后我们将说到的是nodejs的cheerio模块实现爬虫,使用node中的RedLock模块实现node分布式锁

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值