node.js - Express 4-未调用自定义错误处理中间件

标签 node.js express error-handling middleware

我正在尝试在Express应用程序中实现自定义错误处理程序。我认为我正确地遵循了文档,但是我一定做错了,因为只要端点发生错误,我的应用就会返回HTML。

文件:https://expressjs.com/en/guide/error-handling.html

我在这里和GitHub上发现的几乎所有类似问题都已通过放置错误处理中间件和堆栈的最后端得以解决...但是我已经做到了,仍然没有运气。

这是我的代码:

//server.js

import express from 'express';
import body from 'body-parser';
import cookies from 'cookie-parser';
import {
    provideLogger,
    responseStructure,
    errorHandler, // => confirmed is importing the right function
} from '@middleware';
import routes from '@routes';
import { Logger } from '@utils';
import config from '@config';

const logger = new Logger().context('startup');

async function onAppReady(...args) {
    logger.success(`API listening on port ${config.port}`);
}

express()
    .use(body.json())
    .use(cookies())
    .use(provideLogger)
    .use(responseStructure)
    .use(routes)
    .use(errorHandler) // => applied after routes
    .listen(config.port, onAppReady);


//route.js
import { Router } from 'express';
import myRoute from './myRoute';

const router = new Router();

router.use('/route', myRoute);


export default router;


//myRoute.js
import { Router } from 'express';
import endpoint from './endpoint';

const myRoute = new Router();

myRoute.post('/:objectId/', endpoint);


export default myRoute;

//端点
export default function endpoint(req, res, next) {
  console.log('I am an endpoint, time to trigger an error');
  next({ status: 404, message: 'Success not found :(' });
}

//中间件
export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  } = {},
  req,
  res,
  next,
) {
  console.log('I am handling the error');
  res.status(status).send({ error: true });
}

当我向端点发送请求时,它会从端点打印日志,然后返回一个HTML文件,其中包含我作为HTML主体传递给next的数据。我的errorHandler的日志从不打印。

我已经仔细阅读了文档,据我所知,我所做的一切都正确。我必须丢失一些东西,但是呢?为什么我的错误处理程序永远不会被调用?

最佳答案

看来我在错误处理程序中为第一个参数设置默认值的方式存在问题。

从改变

export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  } = {},
  ...


export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  },
  ...

解决它。

关于node.js - Express 4-未调用自定义错误处理中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60977818/

相关文章:

javascript - sinon 没有正确恢复 stub 原型(prototype)方法?

javascript - TypeError : rl. 问题不是函数 - NodeJS - 使用 play.js

matlab - 不断收到无效的表达错误

javascript - 什么时候 .the(success, fail) 被认为是 promise 的反模式?

node.js - npm 安装卡在 loadIdealTree :loadAllDepsIntoIdealTree: sill install loadIdealTree 上

html - Ajax 将表单中的数据发送到 Express js 正文解析器

javascript - Mongoose 和 Node 错误 : cannot read property 'forEach' of undefined

javascript - 在带有express和mysql的nodejs中未定义 session

c# - 我应该如何处理两个类之间的异常?

php - 如何检索 PDO 错误消息?