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

koa-session使用ioredis存储session

长孙永思
2023-12-01

一、引

在写koa的项目,当用到session的时候需要放到redis存储。百度了一圈,几十个人的博客几乎就是几篇文章的复制黏贴,我人晕了。
官方github也看了一眼,md里好像没有对应的使用方法。也懒得找了,就自己解决一下吧。

二、解决方案

本文的解决方案是 koa-session + ioredis + ts

// .config
import * as Ioredis from 'ioredis';
...
...
// 定义的sessionstore的接口
export interface SessionStore {
  get: (key:Ioredis.KeyType) => {},
  set: (key: Ioredis.KeyType, sess: any, maxAge: number) =>{},
  destroy: (key:Ioredis.KeyType) => {}
}
...
...
// 定义的sessionconfig配置接口
export interface SessionConfig {
  key: string,
  maxAge: number,
  autoCommit: boolean,
  overwrite: boolean, 
  httpOnly: boolean, 
  signed: boolean,
  rolling: boolean,
  renew: boolean,
  // 主要是添加这一行,不添加store会默认seesion在内存中,服务重启后就会清空session。
  store?: SessionStore,
  // 也可以使用这个参数,此参数应该为类,然后把三个方法作为类的原型方法
  ContextStore?:
}

/ .redisStore
import * as Ioredis from 'ioredis';

// 自己实现的返回一个redis实例
let redis = (db: number = 0): Ioredis.Redis => {
  return new Ioredis(config.redis(db))
};

// session.store 中要求的 get方法
export const get = async (key: Ioredis.KeyType)=> {
  try {
    let data = await redis().get(`SESSION:${key}`);
    return JSON.parse(data);
  } catch (error) {
    return error
  }
}
// session.store 中要求的 set 方法
export const set = async (key: Ioredis.KeyType, sess: any, maxAge: number = config.redis(0).maxAge)=> {
  try {
    let data = await redis().set(`SESSION:${key}`, typeof sess == 'string' ? sess : JSON.stringify(sess), 'EX', maxAge / 1000);
    return data
  } catch (error) {
    return error;
  }
}
// session.store 中要求的 destroy 方法
export const destroy = async (key: Ioredis.KeyType)=> {
  try {
    let data = await redis().del(`SESSION:${key}`)
  } catch (error) {
    return error;
  }
}

三、结

互相抄,抄的我必须自己解决,我服了。

 类似资料: