Skip to content

session 中间件

Zongmin Lei edited this page Aug 21, 2018 · 2 revisions

基本用法

内置的 session 中间件提供多存储引擎的 Session 支持,并且已内置支持基于 Memory 和 Redis 的存储引擎:

  • SessiionMemoryStore 内存存储引擎
  • SessiionRedisStore Redis 存储引擎,通过传入 Redis 客户端实例实现存储,支持 ioredisredis 模块
  • SimpleRedisClientOptions 简单 Redis 客户端,可以不依赖第三方模块的情况下实现 Redis 存储,直接在 SessionRedisStore 初始化时指定 { host, port, db } 来代替 client 参数即可

其基本用法如下:

import { Application, component } from "@leizm/web";

const app = new Application();
// 需要注意的是,引入 session 中间件前必须引入 cookieParser 中间件
app.use("/", component.cookieParser());
app.use("/", component.session({
  /** 存储引擎实例 */
  store: new component.SessiionRedisStore({
    host: "127.0.0.1",
    port: 6379,
  }),
  /** Cookie名称 */
  name: ”web.sid“,
  /** Cookie选项 */
  cookie: { signed: true },
  /** Session有效时间(单位:毫秒),此参数会覆盖cookie中的maxAge */
  maxAge: 3600,
}));

app.use("/", async function (ctx) {
  // 可通过 ctx.request.session 获取 Session 数据
  console.log(ctx.request.session);
  // 也可通过 ctx.session.data 获取 Session 数据
  console.log(ctx.session.data);

  // 另外可以通过 ctx.session 操作 Session
  await ctx.session.reload();
  await ctx.session.regenerate();
  await ctx.session.destroy();
  await ctx.session.touch();
});

SessiionMemoryStore 内存存储引擎

内存存储引擎只适合开发测试用途,不推荐在生产环境中使用。

SessiionRedisStore Redis 存储引擎

其初始化参数如下:

  • prefix: key前缀,默认为 sess:
  • client: 客户端实例,目前支持 redisioredis 这两个模块的连接实例
  • serialize: 数据序列化函数,默认使用 JSON
  • unserialize: 数据反序列化函数,默认使用 JSON

当不指定 client 参数时表示使用内置的简单 Redis 客户端,需要额外提供如下参数:

  • host: Redis服务器地址,默认为 127.0.0.1
  • port: Redis服务器端口,默认为 6379
  • db: Redis服务器数据库号,默认为 0
  • password: Redis服务器密码,默认无

自定义存储引擎

只要实现了 component.SessionStore 接口的对象都可以作为 session({ store }) 的参数:

interface SessionStore {
  /**
   * 获取session
   * @param sid
   */
  get(sid: string): Promise<Record<string, any>>;

  /**
   * 设置session
   * @param sid
   * @param data
   * @param maxAge
   */
  set(sid: string, data: Record<string, any>, maxAge: number): Promise<void>;

  /**
   * 销毁Session
   * @param sid
   */
  destroy(sid: string): Promise<void>;

  /**
   * 保持session激活
   * @param sid
   * @param maxAge
   */
  touch(sid: string, maxAge: number): Promise<void>;
}