所以我最近开始在node和MEAN中编程,在使用JAVA的时候,我总是专注于创建可靠的应用程序的最佳模式,即使学习曲线要了我的命,我在这里也在尝试同样的方法。无论如何,我正在尝试使用MEANjs实现一个通用的错误处理程序,以便在中央位置有一个异常处理程序,将错误记录到文件中,并在发生这种情况时发送电子邮件。
以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是不是最好的方法,我已经read,有时不是最好的方法,或者这只适用于Express3.xx??快车4怎么样?下面是我在日志文件中使用的东西,然后在快速错误处理程序之前使用它,这是一个好做法,还是应该放在处理程序中?
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}}'
});所以落地了。有没有办法让一个通用的错误处理程序通过express 4使用MEANJS发送电子邮件,当它们登录到一个文件中。并摆脱所有这些重复的mongoose错误处理,记住MEANJS的最佳实践。
发布于 2014-08-03 05:26:42
我可以通过检查Ghost和Mongoose本身的代码来帮助您设置我正在使用的设置。
我的工作流程是制作如下所示的自定义error类(实际上我的想法来自于mongoose custom errors )。
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.
});我通过使用Promises改进了更多的代码。(实际上,这是我从Ghost的源代码中获取的)。
默认情况下,Mongoose也支持promises。因此,您可以简单地执行以下操作:
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) );我希望这能帮助你进一步弄清楚。
https://stackoverflow.com/questions/25099281
复制相似问题