2017-07-28 215 views
1

所以,这件小事。我们所知道的表达有内置的默认错误处理程序,预计四个参数(ERR,REQ,水库,下一个)来处理“同步异常”之类的ReferenceError,类型错误等:究竟Express.js如何处理错误?

UPDATE:这个问题是快递 - 具体,而不是如何捕捉未处理的异常/等。我想知道如何在第一个代码块Express可以处理用户定义的异常。第二个例子与异步。异常并不直接属于这个问题。

const express = require('express')(); 

express.all('*', (req, res) => { 
    throw new Error('my own error'); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Express is still up and running'); 
}).listen(3000); 

但不是这样的:

const express = require('express')(); 

express.all('*', (req, res) => { 
    process.nextTick(() => { 
    throw new Error('my own error'); 
    }); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Won\'t be executed'); 
}).listen(3000); 

但我很好奇实现这一处理程序。

我无法找到像

process.on('uncaughtException'...或域/承诺/集群东西。

也许我想念一些东西。

任何人都可以澄清?

回答

1

有是被执行的catch-all kind of block in Express's router

try { 
    fn(req, res, next); 
} catch (err) { 
    next(err); 
} 

所以在这个块中的所有异常获取,并翻译成next()功能设置为例外匹配错误参数调用。

更详细地,当一个请求到达时表达:

  • app.handle()被调用,然后确定路由器,并通过层调用router.handle()
  • router.handle()过程和最终匹配您的处理程序与express.all('*', ...)签名注册
  • handle_request(在路由器内部的Layer模块中)按照上面的try-catch块的规定调用你的处理函数,有效地捕获所有可能的异常并将它们转换为n分机呼叫。
+1

感谢您的详细解答。我只是做了自己的'快车'来重现这种行为。非常简单和优雅的处理,对我来说。 – loadaverage