我正在尝试在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/