javascript - 从 Express 错误处理中间件而不是 HTML 返回 JSON

标签 javascript node.js express ecmascript-6

我在从 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);
    }

这是我得到的响应页面以供引用:

enter image description here

我不确定自己做错了什么,从 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/

相关文章:

javascript - 如何在不重新加载当前页面的情况下加载 URL?

MySql After Update 触发器执行顺序

javascript - 如何使 Node 导出正常工作?

mysql - 需要路由中的文件才能运行查询

javascript - 如何让 Angular 前端等待快速 REST-Call 响应

node.js - Angular 9 通用错误 : Component 'HeaderComponent' is not resolved:

node.js - React-Router Router.HistoryLocation 刷新页面

php - 用于传递 PHP 变量的 Javascript 语法

javascript - IE 图片宽高 = 0 图片下载前

javascript - 直接从 <script> HTML 标记将变量传递给 Javascript