Skip to content
On this page

koa-session

简介

koa-session 是一个用于管理会话的 Koa 中间件,它提供了一种在服务器端存储用户会话数据的方式,支持多种存储引擎,包括内存存储和外部存储(如 Redis)。

安装

bash
npm install koa-session

基本使用

javascript
const Koa = require('koa');
const session = require('koa-session');

const app = new Koa();

// 配置 session 中间件
app.keys = ['some secret hurr']; // 用于签名的密钥

const CONFIG = {
  key: 'koa.sess', // cookie 键名
  maxAge: 86400000, // cookie 的过期时间 (ms)
  autoCommit: true, // 自动提交 headers
  overwrite: true, // 是否允许重写
  httpOnly: true, // 是否仅允许服务器访问 cookie
  signed: true, // 是否签名 cookie
  rolling: false, // 是否每次响应时刷新 session 的有效期
  renew: false, // 是否在 session 快过期时更新
};

app.use(session(CONFIG, app));

// 使用示例
app.use(async ctx => {
  // 获取 session
  let n = ctx.session.views || 0;
  
  // 设置 session
  ctx.session.views = ++n;
  ctx.body = `${n} 次访问`;
});

app.listen(3000);

外部存储配置

javascript
const session = require('koa-session');
const Redis = require('ioredis');

const redis = new Redis();

// 自定义存储
class RedisStore {
  async get(key) {
    const data = await redis.get(key);
    return JSON.parse(data);
  }

  async set(key, value, maxAge) {
    await redis.set(key, JSON.stringify(value), 'PX', maxAge);
  }

  async destroy(key) {
    await redis.del(key);
  }
}

app.use(session({
  ...CONFIG,
  store: new RedisStore()
}, app));

配置选项

  • key: cookie 的名称
  • maxAge: session 的过期时间
  • autoCommit: 是否自动提交 headers
  • overwrite: 是否允许重写
  • httpOnly: 是否仅允许服务器访问 cookie
  • signed: 是否签名 cookie
  • rolling: 是否每次响应时刷新 session
  • renew: 是否在 session 快过期时更新
  • store: 自定义存储引擎
  • valid: 自定义验证器
  • beforeSave: 保存前的钩子函数

注意事项

  1. 必须设置 app.keys 用于签名
  2. 生产环境建议使用外部存储(如 Redis)
  3. 合理设置 session 的过期时间
  4. 注意 session 数据的大小,避免存储过大的数据
  5. 考虑使用 HTTPS 来保护 session cookie
  6. 在分布式系统中必须使用外部存储来共享 session

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命