Node.js 如何默认将错误返回为JSON而不是使用express返回HTML?

Node.js 如何默认将错误返回为JSON而不是使用express返回HTML?,node.js,express,Node.js,Express,默认情况下,Express以HTML页面的形式返回错误。在开发RESTAPI时,我希望所有错误都是JSON格式的。如何为此配置express 我希望反应是这样的 { "statusCode": 404, "error": "Not Found" } 但是我得到了 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Error

默认情况下,Express以HTML页面的形式返回错误。在开发RESTAPI时,我希望所有错误都是JSON格式的。如何为此配置express

我希望反应是这样的

{
  "statusCode": 404,
  "error": "Not Found"
}
但是我得到了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>
<body>
    <pre>Cannot DELETE /object/</pre>
</body>
</html>
更新: 要澄清的是,我不想将处理程序中的错误作为json处理。这样做很直接


我的目标是让express停止为未注册的处理程序返回html错误,比如在/assessment上执行DELETE,或者在/anUnknownRoute上执行操作您只需将
'Content-Type:application/json'
添加到响应头中,然后基本上以json格式编写任何内容,例如

app.use(function (req, res, next) {
    res.status(404).send("Sorry can't find that!")
})
或者您可以使用
res.json
。更多详细信息,请参见官方文件:

如果您希望在默认情况下返回JSON中的错误,那么您可能有兴趣使用默认的express错误处理机制:

只需将
错误
传递到
下一个
回调,直接转到错误处理程序(跳过中间队列中的所有其他内容),并将错误处理中间件添加到中间件队列的末尾。这应该能奏效

express.js常见问题解答的附言:

在Express中,404响应不是错误的结果,因此错误处理程序中间件不会捕获它们。这种行为是因为404响应只是表示没有额外的工作要做;换句话说,Express已经执行了所有中间件功能和路由,但发现它们都没有响应。您只需在堆栈的最底部(所有其他函数的下方)添加一个中间件函数来处理404响应:


显然,您可以发送JSON格式的响应…

以下是对名义问题的简明回答:

如何默认将错误返回为json

您将自定义错误处理中间件添加到中间件堆栈中,该中间件是常规中间件,但具有4个参数,而不是3个参数。在此错误处理程序中,您使用
res.status(code).send(jsonResponse)
发送json错误

一个简单的快速示例将始终发送status 500 JSON错误:

const bodyParser=require('body-parser'))
const express=require('express')
const jsonErrorHandler=async(err、req、res、next)=>{
res.status(500).send({error:err});
}
const app=express()
//另一个中间件
app.use(bodyParser.json())
//你的经纪人
app.use(jsonErrorHandler)

发布你的路由器处理代码。我已经用我的应用程序代码更新了问题,发布了你的deleteObject函数。如何返回响应对象。我的deleteObject函数与此无关,因为我没有调用它。我正在调用未连接处理程序的/object/上的DELETE,而不是/object/:id。我希望以json格式抛出此错误,而不是htmlapp.DELETE(路径,回调[,回调…])。它清楚地显示了第二个参数是回调函数。然后从deleteObject回调函数发送json格式。我可能无法清楚地解释我的问题。我知道如何返回任何给定路由的json错误。但是,例如,当没有路线被击中时,express会抛出自己的错误。这些是纯html,但我希望它们在json中。@Jakob您可以添加一个中间件来匹配任何不匹配的请求(
app.use(“/”,…){}
)。最后一行确实解决了我的具体问题,但引入了一个新的问题。对现有端点的选项调用不再有效。我猜可能还有其他不想要的行为。手动响应路由器中的选项感觉像是真正的一步。在express中真的没有办法控制不匹配的请求而不破坏其他行为吗?@Jakob Yeap,我的错。其实不应该那么复杂。查看express.js常见问题解答。它们对express.js如何处理404提供了非常清晰的解释。感谢您如此持久,但您的最新解决方案仍然打破了对有效端点的选项调用。真奇怪,这样的解决方案出现在官方文件中,我忘记了它需要第四个参数,即使它没有被用来正确地捕捉错误,我在我的这个愚蠢的超高上挣扎了几个小时,这个答案解决了我的问题!谢谢,别忘了下一个参数!!谢谢@xunux,你的演讲为我节省了几个小时
function(err, req, res, next){
    res.setHeader('Content-Type', 'application/json');
    res.status(500);
    res.send(JSON.stringify(error));
});
app.use(function (req, res, next) {
    res.status(404).send("Sorry can't find that!")
})