Javascript ExpressJS中的错误处理

Javascript ExpressJS中的错误处理,javascript,node.js,express,Javascript,Node.js,Express,我想在expressJS应用程序中开发单点错误处理。 我在expressJS配置中添加了以下代码: app.use(app.router); app.use(function (err, req, res, next) { console.error('ExpressJS : error!!!'); }); 所以,应用程序中发生的任何错误都应该执行上面的函数,这样我就可以用自定义方式处理错误。 但是,上述函数无法在javascript错误或以下代码上执行: throw new Err

我想在expressJS应用程序中开发单点错误处理。 我在expressJS配置中添加了以下代码:

app.use(app.router);
app.use(function (err, req, res, next) {
    console.error('ExpressJS : error!!!');
});
所以,应用程序中发生的任何错误都应该执行上面的函数,这样我就可以用自定义方式处理错误。 但是,上述函数无法在javascript错误或以下代码上执行:

throw new Error('something broke!');
我读过: 和 但是,我仍然无法在我的expressJS应用程序中进行通用错误处理。
有人能解释一下我将如何在单点处理任何应用程序错误吗?

实际上,你需要将错误处理放在路由器的末尾

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
如果您有错误记录器,则必须将其放在错误处理之前

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);            // log the error
app.use(clientErrorHandler);   // catch the client error , maybe part of the router
app.use(errorHandler);         // catch the error occured in the whole router

您可以定义几个错误处理中间件,每个错误处理捕获不同级别的错误。

实际上,您需要将错误处理放在路由器的末尾

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
如果您有错误记录器,则必须将其放在错误处理之前

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);            // log the error
app.use(clientErrorHandler);   // catch the client error , maybe part of the router
app.use(errorHandler);         // catch the error occured in the whole router

您可以定义几个错误处理中间件,每个错误处理捕获不同级别的错误。

不是通过express,而是通过nodejs,您可以尝试

process.on('uncaughtException', function(err) {
  console.log(err);
});
因为throw是javascript,不受expressjs控制

对于这些错误,如express中的路由,您应该能够使用app.error或app.usefunctionerr.捕获。。正如其他人所建议的,这将是可用的req,res对象也

app.error(function(err, req, res, next){
    //check error information and respond accordingly
});

//newer versions
app.use(function(err, req, res, next) {

});

不是用快递,而是nodejs,你可以试试

process.on('uncaughtException', function(err) {
  console.log(err);
});
因为throw是javascript,不受expressjs控制

对于这些错误,如express中的路由,您应该能够使用app.error或app.usefunctionerr.捕获。。正如其他人所建议的,这将是可用的req,res对象也

app.error(function(err, req, res, next){
    //check error information and respond accordingly
});

//newer versions
app.use(function(err, req, res, next) {

});

在express中,通过使用参数调用next触发路由错误处理,如下所示:

app.get('/api/resource',function(req, res, next) {
   //some code, then err occurs
   next(err);
})
调用next将触发链中的下一个中间件/处理程序。如果您像在nexterr中一样向它传递一个参数,那么它将跳过下一个处理程序并触发错误处理中间件

据我所知,如果您只是抛出一个错误,express将不会捕获它,您可能会使您的节点实例崩溃

请记住,您可以根据需要使用任意数量的错误处理程序:

app.use(function (err, req, res, next) {
    //do some processing...
    //let's say you want more error middleware to trigger, then keep on calling next with a parameter
    next(err);
});

在express中,通过使用参数调用next触发路由错误处理,如下所示:

app.get('/api/resource',function(req, res, next) {
   //some code, then err occurs
   next(err);
})
调用next将触发链中的下一个中间件/处理程序。如果您像在nexterr中一样向它传递一个参数,那么它将跳过下一个处理程序并触发错误处理中间件

据我所知,如果您只是抛出一个错误,express将不会捕获它,您可能会使您的节点实例崩溃

请记住,您可以根据需要使用任意数量的错误处理程序:

app.use(function (err, req, res, next) {
    //do some processing...
    //let's say you want more error middleware to trigger, then keep on calling next with a parameter
    next(err);
});

要是这么简单就好了。错误几乎可以发生在任何地方,您必须在发生错误的地方捕获错误,您当然可以使用单个路由来响应服务器错误,但您无法捕获该路由中的所有和任何错误。如果它这么简单就好了。错误几乎可以发生在任何地方,您必须在发生错误的地方捕获它,当然,您可以使用单个路由来响应服务器错误,但您无法捕获该路由中的所有和任何错误。抛出新错误“有东西坏了!”;我的意思是,您需要使用中间件来传递错误:ifer nexter,然后错误处理中间件将接收错误;我的意思是,您需要使用中间件来传递错误:ifer nexter,然后错误处理中间件将接收错误。是否可以在上述代码中获取请求和响应对象?据我所知。不,throw是javascript代码,这是javascript代码。两者都在nodejs中运行,而不是通过express。或者尝试app.error在上述情况下,请求和响应对象是否有任何解决方法?@SachinKumbharkar,我不确定,但据我所知,有app-object附加在某个地方,您可以尝试app.req或app.resIs是否可以在上述代码中获取请求和响应对象?据我所知。不,throw是javascript代码,这是javascript代码。两者都在nodejs中运行,而不是通过express。或者尝试app.error在上述情况下,请求和响应对象是否有解决方法?@SachinKumbharkar,我不确定,但据我所知,有app-object附加在某处,您可以尝试app.req或app.res