[nodejs]nodejs express异常捕获

由于 Node.js 是非阻塞单进程单线程的,一旦 Node.js 抛出异常,整个服务就会停掉,服务将会非常不稳定。解决方法:

  1. 使程序鲁棒:在有可能出现异常的地方,全部使用 try { } catch(){ } 进行嵌套。
  2. Express 的错误捕获机制:作为 Node.js 比较常用的框架,其实 Node.js 自己也有一定的异常错误捕获机制。
1
2
3
4
5
6
// Express' errorHandler
function errorHandler(err, req, res, next) {
    console.error(err.stack);
    res.status(500).send('Something broke!');
}
app.use(errorHandler);
  1. 使用 domain 模块:先下载 domain 模块,npm install domain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Domain 捕获异常
const domain = require('domain');

app.use(function(req, res, next) {
    var reqDomain = domain.create();
    reqDomain.on('error', function(err) {
        console.log(err.stack);
        res.statusCode = 500;
        res.end(err.message + '\n');
        reqDomain.dispose();
    });
    reqDomain.add(req);
    reqDomain.add(res);
    reqDomain.run(next);
});
  1. 使用 forever 启动 app.js:forever 可以看做是一个 Node.js 的守护进程,能够启动、停止、重启我们的 app 应用。
1
forever start app.js

通过这些方法,可以提高 Node.js 服务的稳定性,防止因未捕获的异常导致整个服务崩溃。