如何使用express默认以JSON而不是HTML形式返回错误?

Jak*_*kob 22 node.js express

Express 默认以 HTML 页面形式返回错误。在开发 REST api 时,我希望所有错误都采用 JSON 格式。我如何为此配置快递?

我希望响应看起来像这样

{
  "statusCode": 404,
  "error": "Not Found"
}
Run Code Online (Sandbox Code Playgroud)

但我得到了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>
<body>
    <pre>Cannot DELETE /object/</pre>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我的基本应用

export const app = express();
app.use(express.json());

app.get("/objects", listObjects);
app.get("/object/:id", getObject);
app.post("/object", createObject);
app.put("/object/:id", updateObject);
app.delete("/object/:id", deleteObject);
Run Code Online (Sandbox Code Playgroud)

更新:澄清一下,这不是我想作为 json 处理的处理程序的错误。这样做非常简单。

我所追求的是让 express 停止为未注册的处理程序返回 html 错误,例如在 /assessments 上执行 DELETE,或在 /anUnknownRoute 上执行 GET

Rob*_*per 12

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

一个总是发送状态 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()
// The other middleware
app.use(bodyParser.json())
// Your handler
app.use(jsonErrorHandler)
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,我忘记了它需要第四个参数,即使它没有用于正确捕获错误,我在这个愚蠢的疏忽上挣扎了几个小时,这个答案解决了我的问题!谢谢 (4认同)

Art*_*tem 10

您可以简单地添加'Content-Type: application/json'到您的响应标头中,并以 JSON 格式编写您想要的任何内容,例如

function(err, req, res, next){
    res.setHeader('Content-Type', 'application/json');
    res.status(500);
    res.send(JSON.stringify(error));
});
Run Code Online (Sandbox Code Playgroud)

或者你可以用res.json。请参阅官方文档了解更多详细信息:https : //expressjs.com/en/api.html#res.json

如果您想默认返回 JSON 中错误,那么您可能对使用默认的快速错误处理机制感兴趣:https : //expressjs.com/en/guide/error-handling.html

只需将 an 传递errornext回调即可直接进入错误处理程序(跳过队列中的其他所有内容)并将错误处理中间件添加到中间件队列的末尾。这应该可以解决问题。

PS来自 express.js 常见问题解答:

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

app.use(function (req, res, next) {
    res.status(404).send("Sorry can't find that!")
})
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,我把你的代码放在我的中间件的底部,它可以工作: app.use(function (req, res, next) { res.status(404).send("Sorry can't find that!") }) (2认同)
  • 在 Express 中,404 响应不是错误的结果,因此错误处理程序中间件不会捕获它们 - 非常有用,谢谢 (2认同)