【问题标题】:generic Error handler MEANJS, mongoose, winston通用错误处理程序 MEANJS、猫鼬、温斯顿
【发布时间】:2014-09-25 18:45:41
【问题描述】:

所以我最近开始使用 node 和 MEAN 进行编程,并且在使用 JAVA 工作时,我会始终专注于创建可靠应用程序的最佳模式,尽管学习曲线让我很受挫,但我在这里也尝试了同样的方法。无论如何,我正在尝试使用MEANjs 实现一个通用错误处理程序,以便在中心位置有一个异常处理程序,将错误记录到文件并在发生这种情况时发送电子邮件。
以猫鼬为例

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 这有时不是最好的方法,或者这仅适用于 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 在登录文件时发送电子邮件来获得一般错误处理程序。并摆脱所有这些重复的猫鼬错误处理,牢记 MEANJS 的最佳实践。

【问题讨论】:

    标签: node.js express mongoose winston meanjs


    【解决方案1】:

    我可以通过检查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 默认也支持 Promise。所以只要你做这样的事情:

    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) );
    

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

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2018-11-24
      • 2018-11-19
      • 2020-07-18
      相关资源
      最近更新 更多