提问人:Wais Kamal 提问时间:11/12/2023 最后编辑:Wais Kamal 更新时间:11/14/2023 访问量:34
Express.js 不保存会话数据
Express.js not saving session data
问:
我正在构建一个 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/auth
console.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 之后),但无济于事。
那么,我该如何解决这个问题呢?
答:
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
评论
connect.sid
credentials: 'include'
fetch()