多次调用 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"
});
});
};
嗨, 我在尝试实现 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"
});
});
};