1. 不要使用 "try ... catch" ,因为nodejs都是异步操作,try catch无法捕捉回调里面的异常,除非你在回调里面也写try catch
try...catch statement cannot catch the error in callback. Here is an example:fs = require('fs');
try {
fs.stat('doesnt_exist.txt', function(err, stats) {
if (err) {
throw err;
}
console.log('data', stats);
});
}
catch (e) {
console.error('error statting');
}
这里的错误不会被捕捉。
解决方案
- 把数据库查询或者文本读取的try catch改为处理回调函数里面的第一个参数err,因为这些操作如果出错在nodejs里面是不会跑出异常而是返回一个err对象
- 使用forever https://github.com/nodejitsu/forever 这样进程挂掉就会被立马再次启动起来,记得设置 spinSleepTime !否则你的程序在1s内挂两次就再也启动不起来了
- 官方建议使用domain对象,如果是使用express的朋友可以直接使用 express-domain-middleware,这个插件有几个好处
a 捕获系统中所有的异常,并且可以自己定义出错的解决逻辑
b 在所有的流程中都会增加一个requestid,可以通过这个id在日志中体现出一个请求所经过的流程,解决了异