在写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;
}
}
互相抄,抄的我必须自己解决,我服了。