Nodejs 使用 express session 时遇到的问题,麻烦各位帮我看看。

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs 使用 express session 时遇到的问题,麻烦各位帮我看看。

最近在学 nodejs,在实现 评论验证码时遇到了一个问题。

代码:

app.use(session({
  // name: identityKey,
  secret: 'xiao-gan-de-session-ce-shi',  // 用来对 session id 相关的 cookie 进行签名
  store: new MongoStore({ mongooseConnection: mongoose.connection }),  // 本地存储 session (文本文件,也可以选择其他 store,比如 redis 的)
  saveUninitialized: false,  // 是否自动保存未初始化的会话,建议 false
  resave: false,  // 是否每次请求都重新生成 session
  // unset:null,
  cookie: {
    maxAge: 10 * 3000,  // 有效期,单位是毫秒
  }
}));

app.use(function timeLog(req, res, next) { console.log('Time: ', Date.now()) // req.session.captcha = captcha.text; next() })

app.use(cookieParser()); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.use(bodyParser.raw()) app.use(’/api/captcha’, captcha) app.use(’/api/comment’, comment) app.use(’/api/base’, base)

问题:

  1. 初始化时 mongodb 内可以看到 4 个 session 数据,我期望的是 1 条公用的 session 数据,是不是我理解有问题。
  2. 当我在 app.use('/api/captcha', captcha) 内获取到随机验证码 并像这样赋值 req.session.captcha = 4444 时,app.use('/api/comment', comment) 内因为和 captcha 内 不是一个 session,所以拿不到 captcha 这个字段。

请问我应该怎么解决呢?


2 回复

已解决,是因为跨域导致的每次请求 sessionid 都不同


当你在使用 Node.js 和 Express 进行 web 开发时,集成 session 通常是通过 express-session 中间件来实现的。这里有几个常见的问题及其解决方案,希望能帮到你。

1. Session 未保存或无法读取

确保你已经正确设置了 session 密钥和存储选项。以下是一个基本示例:

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
  secret: 'your_secret_key', // 更改为你的密钥
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false } // 如果你使用的是 HTTPS,请设置为 true
}));

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
    res.send(`You have visited this page ${req.session.views} times`);
  } else {
    req.session.views = 1;
    res.send('Welcome to the session demo. Refresh!');
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

2. Session 过期问题

确保你设置了合适的 cookie.maxAgecookie.expires

app.use(session({
  // ...其他配置
  cookie: { 
    maxAge: 1000 * 60 * 60, // 1 小时
    secure: false 
  }
}));

3. 跨域问题

如果你的应用涉及跨域请求,确保 cookie 可以被正确发送。

希望这些信息能帮助你解决问题!如果问题仍然存在,请提供更详细的错误信息或代码片段。

回到顶部