我有一个在 localhost:3001 上运行的 NextJS 客户端和一个在 localhost:3000 上运行的 Express/MongoDB 服务器。
对于我使用express-session
的身份验证,connect-mongo
如下所示:
app.use(session({
secret: 'jordan-peterson-is-a-fraud',
resave: false,
saveUninitialized: false,
unset: 'destroy',
cookie: {
httpOnly: false
},
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
在登录时我设置req.session.user = userID
了,这似乎工作正常:它在我的数据库的会话表中注册一个新的会话记录,并向connect.sid=<encrypted-session-ID>
客户端发送一个带有值的 set-cookie 标头,该值存储在会话 cookie 中。
到目前为止,一切都很好。
但是在注销时,调用似乎req.session.destroy()
没有任何效果。客户端将带有凭据的 POST 发送到/logout
服务器:
fetch('http://localhost:3000/logout', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
mode: 'cors',
credentials: 'include'
})
服务器似乎确实收到了一个正确的req
对象,其中包括:
{
...
sessionID: '<encrypted-session-ID>',
session: Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: false
}
}
...
}
[Function: destroy]
当我登录时,控制台也会打印req.session.destroy
。但是当我调用它时没有任何反应。数据库未更改 - 登录时会话记录仍然存在。
router.all('/logout', async function(req, res){
if (req.session) {
req.session.destroy();
return res.end();
}
}
有人知道我在这里做错了什么吗?