通用error handling程序MEANJS,mongoose,温斯顿

所以我最近开始在节点和平均编程,而在与JAVA工作时,我总是专注于最好的模式来创build可靠的应用程序,即使学习曲线正在杀死我,我在这里也一样。 无论如何,我试图实现一个通用的error handling程序使用MEANjs在中央的地方有一个exception处理程序,logging错误到一个文件,并在发生这种情况时发送电子邮件。
以mongoose为例

app.route('/process/:pId').get(function(req, res){ pModel.findById(req.params.pId, function(err, doc){ if(err) {//this is so console.log(err);//repetitive so I would res.send(500, 'Error: error.'); }//like to send all these errors to a central handler like in express.js below res.json(200, {data: doc}); }); };); 

这是express.js中的处理程序:

  app.use(function(err, req, res, next) { if (!err) return next(); // can I call another error handlers at this level?? console.error(err.stack); // Error page res.status(500).render('500', { error: err.stack}); }); 

所以这里是它混乱的地方,因为我试图用express来实现一个中间件我不确定app.use是否是最好的方法,我读过的有时并不是最好的答案,或者这只是用于Express 3.xx的? 快递4呢? 下面是我用于logging器文件,然后在expressionerror handling程序之前使用它是这种良好的做法,或者它应该进入处理程序?

 var logger = expressWinston.logger({ transports:[ new (winston.transports.File)({ filename:'./app/log/winston.log', colorize: false, json: true }) ], statusLevels:true, meta: true, msg: 'HTTP {{req.method}} {{req.url}}' }); 

所以登陆这个 有没有办法通过使用MEANJS在发生login到文件时发送电子邮件通过快递4有一个通用的error handling程序。 并摆脱所有这些重复的mongooseerror handling记住MEANJS的最佳实践。

我可以通过检查Ghost和Mongoose本身的代码进行一些调查后,使用我正在使用的设置来帮助您。

我的工作stream是使自定义错误类看起来像这样(实际上我从mongoose自定义错误的想法。

 var AppError = function (err) { var name = "Application Error", msg; if ( err instanceof Error ) { msg = err.message; name = "Application Error [" + err.name + "]"; } else { msg = err; } Error.call(this); Error.captureStackTrace(this, arguments.callee); this.message = msg; this.name = name; // Here is the interesting part console.log('An error occured', this); // Or even let's pretend smtp is our mail module smpt.send('admin@site.com', err); } 

通过使用这个我总是做这样的事情:

 dbUser.find(query, function(err, data) { if ( err ) return new AppError(err); // Do other stuff. }); 

我使用Promise改进了这个代码。 (其实我从Ghost的源代码中得到这个)。

mongoose默认也支持承诺。 所以只要你做这样的事情:

 var wrapError = function(res) { return function(err) { new AppError(err); res.send(500, "Internal server error"); }; } 

稍后在您的查询代码

 dbUser.find(query).exec().then( function(data) { console.log(data) }, wrapError(res) ); 

我希望这可以帮助你进一步弄清楚。