Nodejs下koa的koa-session-mongoose和koa-session-mongo超时时间设置为何无效?

Nodejs下koa的koa-session-mongoose和koa-session-mongo超时时间设置为何无效?

超时可以never吗?

4 回复

Node.js 下 Koa 的 koa-session-mongoosekoa-session-mongo 超时时间设置为何无效?

背景

在使用 Koa 框架时,为了管理用户的会话(session),我们通常会使用第三方中间件如 koa-session-mongoosekoa-session-mongo。这些中间件允许我们将会话数据存储在 MongoDB 数据库中,从而提供更持久和可扩展的会话管理。

然而,在实际开发过程中,开发者可能会遇到一个问题:即使设置了超时时间,会话仍然会在短时间内失效。这可能是由于配置不正确或者某些细节没有被注意到导致的。

示例代码

首先,我们来看一下如何正确地设置超时时间:

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

const app = new Koa();

// 配置 MongoDB 连接
mongoose.connect('mongodb://localhost:27017/mydb', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 配置会话中间件
app.use(session({
  key: 'koa:sess', // 默认是koa:sess
  maxAge: 86400000, // 会话过期时间,单位为毫秒(例如:一天)
  overwrite: true, // 是否可以覆盖已有的会话
  httpOnly: true, // 是否只能通过 HTTP 访问
  signed: true, // 是否签名会话
  store: new (require('koa-session-mongoose'))({
    collectionName: 'sessions',
    expires: 86400000 // 会话过期时间,单位为毫秒
  })
}, app));

// 示例路由
app.use(async ctx => {
  if (ctx.cookies.get('koa:sess')) {
    ctx.body = 'Session is active.';
  } else {
    ctx.body = 'No session found.';
  }
});

app.listen(3000);

解释

  1. maxAgeexpires:这两个属性用于设置会话的过期时间。maxAge 设置的是从会话创建开始的时间,而 expires 设置的是具体的过期时间戳。确保它们的一致性非常重要。

  2. koa-session-mongoose:在配置存储时,你需要指定 collectionNameexpires 属性来设置会话集合名称和过期时间。

  3. 验证:可以通过检查 koa:sess cookie 来确认会话是否有效。

超时可以 never 吗?

理论上,你可以将 maxAgeexpires 设置为一个非常大的值(如 Infinity),但这并不意味着会话永远不会过期。实际上,这种做法可能会带来安全风险,并且可能不符合业务需求。建议根据实际业务场景合理设置会话的超时时间。

希望以上内容能帮助你解决关于 koa-session-mongoosekoa-session-mongo 超时时间设置的问题。


什么意思?

……没人用过么T-T

在使用 koa-session-mongoosekoa-session-mongo 这两个中间件时,如果你发现设置超时时间无效,可能是因为配置方式不正确或版本更新带来的变化。这两个中间件都允许你设置会话的过期时间,但是你需要确保在配置时使用正确的属性名和值。

示例代码

使用 koa-session-mongoose

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

const app = new Koa();

// 配置mongoose连接
mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true });

app.use(session({
    collection: 'sessions', // 会话存储集合名称
    expires: 86400 * 1000, // 设置超时时间为1天
}));

app.use(async ctx => {
    ctx.session.count = (ctx.session.count || 0) + 1;
    ctx.body = `You visited this page ${ctx.session.count} times`;
});

app.listen(3000);

使用 koa-session-mongo

const Koa = require('koa');
const session = require('koa-session-mongo');
const mongoose = require('mongoose');

const app = new Koa();

// 配置mongoose连接
mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true });

app.use(session({
    collection: 'sessions', // 会话存储集合名称
    ttl: 86400, // 设置超时时间为1天(秒)
}));

app.use(async ctx => {
    ctx.session.count = (ctx.session.count || 0) + 1;
    ctx.body = `You visited this page ${ctx.session.count} times`;
});

app.listen(3000);

解释

  • koa-session-mongoose 中,你可以通过 expires 属性来设置会话的超时时间。
  • koa-session-mongo 中,你可以通过 ttl 属性来设置会话的超时时间。

注意事项

  • 确保你的MongoDB数据库已经启动并可访问。
  • 检查是否使用了正确的包版本,因为某些配置选项可能在不同版本中有所不同。
  • expiresttl 的单位分别是毫秒和秒。
回到顶部