我如何处理express route json错误(如果没有“发送后无法设置标头”)

我如何处理express route json错误(如果没有“发送后无法设置标头”),express,Express,我有一个Express route,它使用response.json返回响应。然而,我不知道如何用它捕捉错误案例。如果我这样做: try { response.json(); } catch (e){ response.send('it went wrong!' } 或者如果我这样做了: .then(() => response.json()) .catch(() => response.send('it went wrong!') 我收到一个无法设置发送后的标题的错误

我有一个Express route,它使用response.json返回响应。然而,我不知道如何用它捕捉错误案例。如果我这样做:

try {
   response.json();
} catch (e){
  response.send('it went wrong!'
}
或者如果我这样做了:

.then(() => response.json())
.catch(() => response.send('it went wrong!')
我收到一个无法设置发送后的标题的错误


这是有道理的,因为json调用end,并且不能在调用end之后设置头。但是,如果在json中发生错误后我无法编辑响应,那么在这种情况下我怎么可能返回错误响应呢。。。或者您可以随时检查:

if (!res.headerSent) {
 // do your stuff end with res.json(), res.end(), res.render() or whatever you need
}

这里只有一个头。express中有几个方法实际上可以结束res.json、res.render请求。如果在这些方法之后调用res.end,您将看到此错误。所以问题是,如何重构路由逻辑以防止在发送任何其他响应后出现res.end…是的,没错。正如我在问题中所解释的,我确实理解发生了什么。我不明白的是如何处理正在发生的事情,以便在json出错时返回错误响应。IMHO,响应的结尾不应该是逻辑的一部分。。。它能被移到你的试捕之外并移到最后吗?。。。您可以根据逻辑的成功或错误创建不同的JSON,最后只需发送带有嵌入消息的对象。如果你在使用承诺,同样的事情。。。你的最后一句话应该是一个回应或你的捕获,但应该是你的逻辑的最后一句话,或是完全脱离它。。。再说一次,这只是一个观点,这就是我以前解决此类问题的方法。我不明白这有什么帮助:在我调用.json之前不会发送头,所以检查它们是否在之前设置了也没有帮助,因为json错误仍然无法响应。。。。我能想到为什么.json调用会失败的唯一原因是,它正在执行其中的逻辑,或者正在发送格式错误的json字符串。。。另一个原因是,在res.json之前有res.*,并且在res.json之前设置了头。。。我建议对res.send进行修改,以通知用户。。。但这意味着逻辑的改变。抱歉,它不能满足您的需要。。。只是想帮忙:这毕竟是我的逻辑问题,谢谢。:D很高兴它帮了我的忙: