通用错误处理程序MEANJS,mongoose,winston

时间:2014-08-02 20:49:09

标签: node.js express mongoose winston meanjs

因此我最近开始使用节点和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});
   });

所以这里是令人困惑的地方,因为我试图用快递实现中间件我不确定app.use是否是最好的方法,我read那个有时不是最好的方法,或者这只是Express 3.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的最佳实践。

1 个答案:

答案 0 :(得分:4)

在我通过检查GhostMongoose本身的代码进行调查后,我可以帮助您完成我的设置。

我的工作流程正在制作看起来像这样的自定义错误类(实际上我从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) );

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