Express.js 不保存会话数据

Express.js not saving session data

提问人:Wais Kamal 提问时间:11/12/2023 最后编辑:Wais Kamal 更新时间:11/14/2023 访问量:34

问:

我正在构建一个 Web 应用程序,我想为每个客户端分配一个随机用户 ID(应在会话中保留)。为此,我正在设置 userId 会话变量。

const app = express()
app.use(session({
    secret: '1234',
    resave: true,
    saveUninitialized: true,
}))
app.use(cors())
app.use(express.json())
app.use(express.urlencoded())
app.use(express.static("public"))

app.get("/", (req, res) => {
    req.session.userId = "user-" + utils.generateRandomString()
    res.sendFile(__dirname + '/index.html')
})

app.post("/api/auth", (req, res) => {
    console.log(req.session)
    // auth logic
    res.send("Success")
})

因此,当用户导航到 时,将设置 userId。这个 userId 应该和下一个请求一起发送到 ,但 userId 会话变量总是未定义的。这是调用打印的内容://api/authconsole.log

Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

编辑:这是导致问题的最小客户端代码:

fetch("/api/auth", {
    method: "POST",
    body: ""
}).then(res => res.text().then(text => console.log(text)))

我尝试更改会话中间件的顺序(将其放在 cors、json、urlencoded 和 static 之后),但无济于事。

那么,我该如何解决这个问题呢?

Express 会话变量

评论

0赞 jfriend00 11/12/2023
这可能是客户端问题。是什么在提出第二个请求?是通过 Javascript 进行的 Ajax 调用吗?如果是这样,它必须具有正确的设置,以便发送会话 cookie。如果它不发送会话 cookie,则下一次调用将只创建一个新的空会话。请出示提出此请求的相关客户端代码。
0赞 Wais Kamal 11/12/2023
是的,这是一个 AJAX 调用。但是会话 cookie () 包含在请求中,我可以在浏览器的开发工具中看到它。问题可能出在服务器中 - 它无法找到具有给定会话 ID 的会话。connect.sid
0赞 jfriend00 11/12/2023
请出示相关的客户端代码。我认为服务器代码没有任何问题。
0赞 Wais Kamal 11/12/2023
我已将(缩小的)客户端代码添加到问题中。
0赞 jfriend00 11/12/2023
您需要带有选项的选项,以便它将发送会话 cookie。请参阅 stackoverflow.com/questions/50698444/...credentials: 'include'fetch()

答:

1赞 jfriend00 11/14/2023 #1

要用答案结束这个问题,您可以更改以下内容:

app.use(express.static("public"));

对此:

app.use(express.static("public"), {index: false});

问题在于“窃取”了路由(因为它在其目录中发现了一个文件,因此应该为该路由运行然后执行这行代码的路由处理程序从未被执行:express.static()/index.html

req.session.userId = "user-" + utils.generateRandomString()

因此,这不是丢失cookie或会话的问题。这是所需的路由处理程序从未执行的问题,因此该值从未在会话中设置过。userId