【发布时间】:2019-07-16 15:15:01
【问题描述】:
我在从我的 Express 处理中间件返回 JSON 响应时遇到了一点问题。目前,我在 Postman 中收到一个 HTML 错误页面。在我的实际客户端上,我只从控制台中的fetch 请求返回一个500 error。应该是错误消息的 JSON 数据没有按预期通过。
这是我的错误处理函数。它只是将错误作为 JSON 响应传递回客户端。任何时候在我的控制器路由中调用next(some_error),Express 都会通过这个错误处理函数对它们进行管道传输:
const express = require('express');
const router = express.Router();
exports.errorHandler = (err, req, res, next) => {
res.setHeader('Content-type', 'application/json');
res.status(500).json({ err });
};
module.exports = router;
这是控制器路由的一部分,我故意在其中抛出一个错误以测试错误处理中间件:
if (isMatch) {
const payload = { id: user._id };
jwt.sign(
payload,
JWT_SECRET_KEY,
{ expiresIn: 900000 },
(err, token) => {
if (err) {
const error = new Error(JWT_FAILED);
error.httpStatusCode = 400;
return next(error);
}
payload.token = `Bearer ${token}`;
return res.status(200).json({
success: true,
accountant: payload
});
}
);
} else {
const error = new Error(PASSWORD_INCORRECT);
error.genericError =
'The provided password did not match the database.';
error.httpStatusCode = 400;
return next(error);
}
这是我收到的回复以供参考的页面:
我不确定我做错了什么,我通常不会遇到从 Express 发回 JSON 响应的问题。我有一种预感,Express 处理的错误需要一个额外的步骤才能默认返回为 HTML 而不是 JSON。
【问题讨论】:
-
您的
errorHandler实际附加到app的位置在哪里? -
在我的
server.js中的路线下方:看起来像:app.use(errorHandler);。最初我应该提到这一点,但我的错误处理程序正在工作(尽管没有返回 JSON),所以我没有考虑包含它。 -
需要注意的是,您的
res.setHeader()调用是多余的。res.json()方法已经在响应中设置了正确的 Content-Type。在您的errorHandler之前,您还有其他错误处理中间件吗?我还会在你的errorHandler中添加一个console.log(),最好插入一个Date,这样你就可以准确地看到它何时(或何时不)被调用。 -
@PatrickRoberts 我确实有另一个错误处理中间件,用于在我的终端中注销错误的端点请求。我已经对此发表了评论,以查看这是否导致问题并且没有任何影响。我徒劳地使用了
res.setHeader(),试图让它工作,删除它并离开res.json(),但仍然返回一个HTML页面。 -
那么,鉴于此信息,我没有想法,但我建议将
console.log()添加到您管道中的每个相关区域,以验证您到目前为止所做的假设。我遇到了几个我无法修复的错误,直到我意识到我对代码所做的一些隐含假设是错误的。
标签: javascript node.js express ecmascript-6