我正在构建一个网络应用程序,我想为每个客户端分配一个随机用户 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 应该与下一个请求一起发送到 /api/auth
,但是 userId 会话变量始终是未定义的。这就是 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 之后)但无济于事。
那么,我该如何解决这个问题?
要以答案结束此问题,您可以更改此设置:
app.use(express.static("public"));
对此:
app.use(express.static("public"), {index: false});
问题是
express.static()
正在“窃取” /
路由(因为它在其目录中找到了 index.html
文件,因此应该为该路由运行然后执行这行代码的路由处理程序是从未被处决:
req.session.userId = "user-" + utils.generateRandomString()
所以,这不是丢失 cookie 或会话的问题。这是所需的路由处理程序从未执行的问题,因此
userId
值从未在会话中设置。