Express.js:Express全局错误处理程序不工作,异常仍然使应用程序崩溃



我在app.js的最后几行添加了一个express全局错误处理程序,但是控制器中抛出的异常仍然导致应用程序崩溃。

identity.controller.js

const createError = require('http-errors');
exports.identifyUser = async (req, res) => {
throw new createError(404, 'Test');
}

app.js

// Configure routes
routes.register(app);
app.use(function(err, req, res, next) {
res.status(err.status || 500).json(response.error(err.status || 500));
});
module.exports = app;

当调用identifyUser时,我期望来自express的错误响应500。但是,一个异常未被捕获,导致我的应用程序失效。

NotFoundError: Test
at exports.identifyUser (C:Users......srcapicontrollersidentity.controller.js:9:11)
at Layer.handle [as handle_request] (C:Users......node_modulesexpresslibrouterlayer.js:95:5)
at next (C:Users......node_modulesexpresslibrouterroute.js:144:13)
at C:Users......srcapimiddlewaresauthUser.js:30:16
at C:Users......node_modulesjsonwebtokenverify.js:223:12
at getSecret (C:Users......node_modulesjsonwebtokenverify.js:90:14)
at module.exports [as verify] (C:Users......node_modulesjsonwebtokenverify.js:94:10)
at C:Users......srcapimiddlewaresauthUser.js:19:16
at Layer.handle [as handle_request] (C:Users......node_modulesexpresslibrouterlayer.js:95:5)
at next (C:Users......node_modulesexpresslibrouterroute.js:144:13)
at Route.dispatch (C:Users......node_modulesexpresslibrouterroute.js:114:3)
at Layer.handle [as handle_request] (C:Users......node_modulesexpresslibrouterlayer.js:95:5)
at C:Users......node_modulesexpresslibrouterindex.js:284:15
at Function.process_params (C:Users......node_modulesexpresslibrouterindex.js:346:12)
at next (C:Users......node_modulesexpresslibrouterindex.js:280:10)
at Function.handle (C:Users......node_modulesexpresslibrouterindex.js:175:3)
at router (C:Users......node_modulesexpresslibrouterindex.js:47:12)
at Layer.handle [as handle_request] (C:Users......node_modulesexpresslibrouterlayer.js:95:5)
at trim_prefix (C:Users......node_modulesexpresslibrouterindex.js:328:13)
at C:Users......node_modulesexpresslibrouterindex.js:286:9
at Function.process_params (C:Users......node_modulesexpresslibrouterindex.js:346:12)
at next (C:Users......node_modulesexpresslibrouterindex.js:280:10)
Node.js v18.7.0
[nodemon] app crashed - waiting for file changes before starting...

我在Windows 11上运行Node.js v18.7.0和Express 4.18.1。

来自Express文档:

对于路由处理程序和中间件调用的异步函数返回的错误,必须将它们传递给next((函数,Express将在其中捕获并处理它们。

尝试替换

exports.identifyUser = async (req, res) => {
throw new createError(404, 'Test');
}

通过

exports.identifyUser = async (req, res, next) => {
next(new createError(404, 'Test'));
}

Express的全局错误处理程序不会捕获应用程序中的任何错误,您仍然需要使用try/catch块自己执行,然后用您的错误作为参数调用next函数。

const createError = require('http-errors');
exports.identifyUser = async (req, res, next) => {
try {
throw new createError(404, 'Test');
} catch(err) {
next(err);
}
}

我认为你不需要http错误,只要你使用express,你可以抛出新的Error。

试试这个:

exports.identifyUser = async (request, response, next) => {
try {
throw new Error (404, 'Test'));
} catch {
next (Error);
}
}

最新更新