由于 Node.js 是非阻塞单进程单线程的,一旦 Node.js 抛出异常,整个服务就会停掉,服务将会非常不稳定。解决方法:
- 使程序鲁棒:在有可能出现异常的地方,全部使用
try { } catch(){ } 进行嵌套。
- 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);
|
- 使用 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);
});
|
- 使用 forever 启动 app.js:forever 可以看做是一个 Node.js 的守护进程,能够启动、停止、重启我们的 app 应用。
通过这些方法,可以提高 Node.js 服务的稳定性,防止因未捕获的异常导致整个服务崩溃。