1

我有一个在 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();
    }
}

有人知道我在这里做错了什么吗?

4

2 回答 2

1

您可以使用删除 req.session.user;

于 2020-06-29T10:42:55.880 回答
0
req.session.destroy(req.sessionID)
于 2020-06-29T11:00:45.917 回答