node.js 中 session(基于mongodb和express, 并且前后端代码分离,通过http请求连接) 问题

发布于 2022-09-04 04:56:07 字数 2727 浏览 8 评论 0

前言

此项目基于前后端分离, express, mongoose, http通讯, session存储在mongodb中 (下文有源码),
mongodb连接良好

问题

session存储在mongodb中,并且前后端代码分离, 造成 cookie 中的 connect.sid(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化(可能我对cookie的了解不深, 没真正弄懂吧), 这样造成我在登录完成后( login.js ), 设置了了 req.session.current_user = 'ly',并且在当前请求中 console.dir(req.session) 是可以打印出 current_user, 但是当我发起另外一个请求( article.js )时, 发现 console.dir(req.session) 中压根就 不存在 current_user

初步怀疑是 cookie 的域设置的问题(即是在不在当前域名下有效), 我前端的域名为 http://localhost:8080/loginhttp://localhost:8080/article/lists, 后端的域名为 http://localhost:3000/user/loginhttp://localhost:3000/article/lists

请问我的cookie中的 pathdomain 分别设置为什么才是合法的?暂时代码如下:

文档

app.use(session({
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  secret: 'ly',
  resave: false,
  saveUninitialized: true,
  cookie: {
    path: '/',
    domain: 'localhost',
    // secure: false,
    // maxAge: half_hour
    secure: false,
    // expires: false,
    maxAge: null
  }
}))

源码

app.js(入口文件):


import cookieParser from 'cookie-parser'
import session from 'express-session'
const MongoStore = require('connect-mongo')(session)
import mongoose from 'mongoose'

// 支持跨域
app.use(require('cors')())

app.use(cookieParser())

app.use(session({
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  secret: 'ly',
  resave: false,

  // 表示cookie的name,默认cookie的name是:connect.sid
  // name: 'connect.sid',

  saveUninitialized: true,
  cookie: {
    // secure: false,
    // maxAge: half_hour
    
    // 新添加的
    path: '/',
    domain: 'localhost',
    
    secure: false,
    expires: false,
    maxAge: null
  }
}))

login.js:

function login (req, res, next) {
  req.session.current_user = 'ly'

  // 这里可以打印出 current_user: 'ly'
  console.dir(req.session)

  // 输出:
  // Session {
  // cookie:
  // { path: '/',
  //   _expires: null,
  //   originalMaxAge: null,
  //   httpOnly: true,
  //   secure: false },
  // current_user: 'ly' }
}

article.js

function lists (req, res, next) {
  // 这里 current_user 消失了
  console.dir(req.session)

  // 输出:
  // Session {
  // cookie:
  //  { path: '/',
  //    _expires: null,
  //    originalMaxAge: null,
  //    httpOnly: true,
  //    secure: false } }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

日记撕了你也走了 2022-09-11 04:56:07

“造成 cookie 中的 connect.sid(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化”的原因很可能是因为cookie丢失或过期了。
在这个情景下过期很可能expires和maxage的设置问题。
可以试试根据https://github.com/expressjs/...去配置cookie的行为。

眼角的笑意。 2022-09-11 04:56:07

遇到了相同的问题,似乎是跨域问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文