我在从 Express 处理中间件返回 JSON 响应时遇到一些问题。目前,我在 Postman 中收到一个 HTML 错误页面。在我实际的客户端上,我只从控制台中的 fetch
请求返回一个 500 错误
。应该是错误消息的 JSON 数据没有按预期传递。
这是我的错误处理函数。它只是将错误作为 JSON 响应传递回客户端。任何时候在我的 Controller 路由中调用 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;
这是我故意抛出错误以测试错误处理中间件的 Controller 路由的一部分:
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。
最佳答案
这解决了我的问题。我删除了 router
并添加了 module.exports = errorHandler
,这解决了问题。 Express 没有调用我的 errorHandler
中间件函数。它只是在我的 Controller 路由中看到 next(some_error)
,然后以默认方式返回错误。我假设我的 errorHandler
函数返回了这个,而实际上,我的函数从未被调用过。
这是更新的错误处理中间件:
const errorHandler = (err, req, res, next) => {
res.json({ err: 'and error' });
};
module.exports = errorHandler;
这现在发回 JSON。呸。
关于javascript - 从 Express 错误处理中间件而不是 HTML 返回 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060489/