22

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

我希望响应看起来像这样

{
  "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>

这是我的基本应用

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);

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

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

4

3 回答 3

13

您将自定义错误处理中间件 - 这是常规中间件,但有 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)
于 2019-12-17T18:00:47.847 回答
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));
});

或者,您可以res.json改用。请参阅官方文档以获取更多详细信息:https ://expressjs.com/en/api.html#res.json

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

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

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

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

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

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

于 2018-12-26T12:13:09.410 回答
1

要获得错误的 JSON 响应,您所要做的就是在路由处理程序中添加另一个参数,该参数将成为负责错误的中间件函数。

例如:你必须修改这个

app.get('/objects', listObjects); 

变成这样:

app.get('/objects', listObjects, (err, req, res, next) => {
    res.status(404).send({error: err.message})
});
于 2021-11-07T13:01:30.673 回答