当前位置: 首页 > 工具软件 > koa-ip > 使用案例 >

Koa2-redis框架实现session存储时的配置

陈文景
2023-12-01

目的

大家都知道,我们配置redis服务端时,出于安全考虑,一定要修改默认端口,添加密码。因此,本文介绍当用 koa-generic-sessionkoa-redis 框架实现redis存储session数据、搭建nodejs服务器的时候,更改redis-server端口和密码之后,如何配置koa2-redis框架以及更改参数。

引用框架

const session=require('koa-generic-session');
const redisStore=require('koa-redis');

注册中间件

app.use(session({
  //配置cookie
  cookie:{
    path:'/',
    httpOnly:true,
    maxAge:24*60*60*1000,
  },
  store:redisStore(
  	//options对象:
    {
      host:'127.0.0.1',
      port:8888,
      password:'123456'
      //下面这两个是错误写法
      //all:`127.0.0.1:8888`		
      
      // all:{
      //   port:8888,
      //   host:'127.0.0.1',
      //   password:'123456'
      // }
    }

  )
}));

这里cookie的配置不再赘述。关键在于 store 属性的值,我们要用构造函数redisStore(options)。而这里options应该是什么?参考github里koa-redis源文档对option的介绍,可以是一个all(这个all是json对象还是字符串我也不知道,文档中说的是" Useful things "),也可以直接写参数。上面代码中被注释掉的两段就是试验。实际结果是那两种都不行。这里正确写法是option就直接传一个json对象,里面的属性我们只需要设置我们更改的部分,即端口和密码,即可。

redisStore()的参数

如果使用注释里的那两个方法给构造函数传参,那么参数将无法被识别(至少在我所安装的版本中是这样),然后我们的koa-session(即redis的客户端)就会使用默认的参数,即端口:6379,且无密码。此时如果redis服务端的端口或密码不是这两个默认值,当我们运行到session时,就会报下面错误

server error TypeError: Cannot set property name of which has only a getter
at defaultErrorHanlder (D:\testServer\node_modules\koa-generic-session\lib\session.js:558:12)
at D:\testServer\node_modules\koa-generic-session\lib\session.js:98:13
at Generator.throw (<anonymous>)
at step (D:\testServer\node_modules\koa-generic-session\lib\session.js:3:191)
at D:\testServer\node_modules\koa-generic-session\lib\session.js:3:402
at processTicksAndRejections (internal/process/task_queues.js:97:5) {

redisStore()的其他参数

除了端口,主机地址和密码。我们参考官方文档给的API,下面列出一些常用的可以设定的option的值

属性默认值说明
familiy4ip协议版本
connectionName连接名称
connectTimeout10000连接持续时间
path本机domain socket路径
keyPrefix‘’给session每个键值的前缀

总结

其实这个问题是看双越老师的课实践搭服务器来的,课上是没有修改redis端口和密码的,只给了host和port两个参数,用的all格式:all:${127.0.0.1}:${6379}。这个值本来就是默认值,虽然无法被识别,但和没传参一样,koa-session会自动使用默认值。所以课上没出现问题。

关键在于option的格式问题。直接使用一个json对象传给redisStore()不是已经简洁了吗,再嵌套一个all:{}感觉稍微有点奇怪。不知道哪位大佬能解释一下,十分感谢 (ง •̀_•́)ง

参考资料

都是github上的官方项目:
https://pasupulaphani.github.io/node-redis-store/RedisStore.html
https://github.com/tj/connect-redis
https://github.com/koajs/koa-redis
https://github.com/luin/ioredis/blob/master/API.md

 类似资料: