Node.js res.status().send() returns "Cannot set headers after they are sent to the client"
Nodejs res.status().send() returns "Cannot set headers after they are sent to the client"
我有一个 nodejs React 应用程序,我从中获取一些数据到服务器:
await fetch(`${process.env.NEXT_PUBLIC_DR_HOST}/validate`, {
method: 'POST',
body: valBody,
headers: { 'Content-Type': 'application/json' }
})
之后,将验证数据以查看其内容是否有任何错误。
如果一切正常,returned(手动或默认)返回 200 状态代码作为响应,然后应该发生其他事情:
.then(res =>
{
console.log(res)
if (res.status === 200)
{
//do stuff
如果出现错误,将发送 400 代码
if (error)
{
const msg = error.details.map(e => e.message).join(',') //
res.status(400).send("Invalid Data")
throw new ServerError("Invalid Data", 400)
}
只发送 res.status(400)
而没有 .send 只会 return 200 res。一切正常,但抛出错误:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
。发生这种情况只是因为我在状态代码 res.status(400).send("Invalid Data")
之后发送消息,但正如我所说, return 仅状态代码 res.status(400)
不会影响将其保留为 200 的响应状态。什么我应该怎么做?
也有可能
throw new ServerError("Invalid Data", 400)
导致了问题。请求处理程序中的同步异常将被 express 捕获,它会尝试发送错误响应,但你已经完成了
res.status(400).send(...)
因此,删除 throw new ServerError("Invalid Data", 400)
或 res.status(400).send("Invalid Data")
。不要两者都有。这是一个猜测,我们需要查看整个请求处理程序才能确定建议什么。而且,根据代码的结构,您可能还需要一个 return
来阻止任何其他代码路径的执行。
我有一个 nodejs React 应用程序,我从中获取一些数据到服务器:
await fetch(`${process.env.NEXT_PUBLIC_DR_HOST}/validate`, {
method: 'POST',
body: valBody,
headers: { 'Content-Type': 'application/json' }
})
之后,将验证数据以查看其内容是否有任何错误。 如果一切正常,returned(手动或默认)返回 200 状态代码作为响应,然后应该发生其他事情:
.then(res =>
{
console.log(res)
if (res.status === 200)
{
//do stuff
如果出现错误,将发送 400 代码
if (error)
{
const msg = error.details.map(e => e.message).join(',') //
res.status(400).send("Invalid Data")
throw new ServerError("Invalid Data", 400)
}
只发送 res.status(400)
而没有 .send 只会 return 200 res。一切正常,但抛出错误:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
。发生这种情况只是因为我在状态代码 res.status(400).send("Invalid Data")
之后发送消息,但正如我所说, return 仅状态代码 res.status(400)
不会影响将其保留为 200 的响应状态。什么我应该怎么做?
也有可能
throw new ServerError("Invalid Data", 400)
导致了问题。请求处理程序中的同步异常将被 express 捕获,它会尝试发送错误响应,但你已经完成了
res.status(400).send(...)
因此,删除 throw new ServerError("Invalid Data", 400)
或 res.status(400).send("Invalid Data")
。不要两者都有。这是一个猜测,我们需要查看整个请求处理程序才能确定建议什么。而且,根据代码的结构,您可能还需要一个 return
来阻止任何其他代码路径的执行。