多次调用 res 的问题:发送给客户端后无法设置 headers

Problem with multiple call of res : Cannot set headers after they are sent to the client

嗨, 我在尝试实现 2 个 res 时面临同样的问题:我需要它们,但我收到错误消息:“错误 [ERR_HTTP_HEADERS_SENT]:将它们发送到客户端后无法设置 headers ”。那么我怎样才能只制作一个包含 2 个语句的 res 呢?我知道我可以将状态作为第一个参数放在重定向函数中,但是 json 消息怎么样?

module.exports = (app) => {
app.get("/api/logout", (req, res) => {
    res.cookie('jwtCookie', '', {
        maxAge: 1
    });
    res.status(200).json({ message: "user disconnected" });
    res.redirect('/');
});

};

您必须重定向用户的浏览器或发送 JSON 消息。您不能为一个请求同时执行这两项操作。

每个传入的 http 请求只能发送一个响应。而且,在您的代码中,这两个都尝试发送响应:

res.status(200).json({ message: "user disconnected" });
res.redirect('/');

第一行发送状态为 200 的 JONS 响应。 第二行 res.redirect() 发送 302 响应并设置 Location header.

因为 Express 可以看到您已经用第一行发送了一个响应,所以当您尝试用第二行代码发送第二个响应时,它会给您一条错误消息。

因此,您必须决定是发送 JSON 响应还是发送重定向。选择一个或另一个。您不能发送两个单独的回复。

由于您是第一次发送 JSON,因此另一端的客户端似乎是某种代码(例如网页中的 Ajax 调用)。如果是这种情况,您可以在 JSON 响应中包含一个重定向位置,然后依靠客户端自行重定向。

事实证明,如果客户端是可编程客户端,例如网页 Javascript 中的 Ajax 调用,重定向不会导致浏览器更改网页。如果这是你想要发生的事情,你必须让 client-side Javascript 实现它。

所以,你可以这样做:

module.exports = (app) => {
    app.get("/api/logout", (req, res) => {
        res.cookie('jwtCookie', '', {
            maxAge: 1
        });
        res.status(200).json({ 
            message: "user disconnected",
            redirect: "/" 
        });
    });
};

然后,另一端的 Javascript 客户端将在响应 object 中查找 redirect 属性,如果存在,它将设置 window.location 到新值,使浏览器更改它正在查看的页面。

或者,如果您希望客户端实际查找 302 响应并从该响应中获取 Location header,那么您可以这样做:

module.exports = (app) => {
    app.get("/api/logout", (req, res) => {
        res.cookie('jwtCookie', '', {
            maxAge: 1
        });
        res.location('/');
        res.status(302).json({ 
            message: "user disconnected"
        });
    });
};