【问题标题】:Can I get express error handler to catch exceptions thrown inside of a mongoose callback?我可以获得快速错误处理程序来捕获猫鼬回调中抛出的异常吗?
【发布时间】:2013-01-07 16:30:14
【问题描述】:

设置:nodejs、express、mongodb、mongoose

相关代码:

var express = require('express');
var server = express();
server.use(express.bodyParser());
server.use(express.methodOverride());
server.use(server.router);

var mongoose = require('mongoose');
mongoose.connect('localhost', 'test');
var Schema = mongoose.Schema;
var VehicleSchema = new Schema({
    name : String
}, {collection: 'vehicles'});
var Vehicle = mongoose.model('vehicle', VehicleSchema);

server.use(clientErrorHandler);
function clientErrorHandler(err, req, res, next) {
    console.log('client error handler found', err);
    res.send(500, err);
}

server.get('/api/test', function(req, res, next){
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

server.listen(1981);

这将按预期返回一个空数组。

在这里抛出异常:

server.get('/api/test', function(req, res, next){
    throw 'my exception';// <------------------------ here
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

clientErrorHandler 捕获异常时按预期工作。相反,把它扔在这里:

server.get('/api/test', function(req, res, next){        
    Vehicle.find().exec(function(err, rows){
        throw 'my exception';// <------------------------ here
        res.send(rows);
    });
});

然后异常不会被 clientErrorHandler 捕获,而是被 mongoose/lib/util.js 捕获并重新抛出

exports.tick = function tick (callback) {
  if ('function' !== typeof callback) return;
  return function () {
    try {
      callback.apply(this, arguments);
    } catch (err) {
      // only nextTick on err to get out of
      // the event loop and avoid state corruption.
      process.nextTick(function () {
        throw err; //<--------------------------------- here 
      });
    }
  }
}

在没有猫鼬的情况下做一些事情,例如:

server.get('/api/test', function(req, res, next){
    process.nextTick(function(){
        throw 'here';
    });
});

快递也抓不到。

如何避免它被猫鼬而不是快递抓住?我怎样才能得到快递来捕捉错误?我可以快速捕获在单独的刻度上引发的错误吗? (这是我应该报告表达的东西吗?)

我想避免 process.error,因为我希望能够将消息发送回该用户。我意识到可以调用 'next' 并出现错误,我更关心来自其他库的其他异常。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    我意识到可以调用“下一步”并出现错误,我更担心 关于来自其他库的其他异常。

    我怀疑您对此感到担忧,因为您有其他编程语言的背景(至少我的情况是这样)。最后,您不太可能在异步代码中看到异常,因为这不是 Node.js 中的约定,这仍然是可能的,但不太可能。这是来自 Isaac Schlueter 本人:

    "node 中的模式是同步方法抛出,异步方法 将错误作为第一个参数传递给回调。如果第一个 回调的参数是错误的(通常为 null 或未定义),然后 这个世界一切都好。” https://groups.google.com/d/msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ

    【讨论】:

    • “我怀疑你担心这个是因为你有其他编程语言的背景。”你抓住了我
    • 同样的恐惧源于其他编程语言。很高兴知道有这种异步错误处理模式。
    【解决方案2】:

    您应该使用 next 回调返回错误,而不是引发异常,然后您的应用的错误处理程序可以处理该错误。

    如果您调用的函数可能会抛出自己的错误,请将它们包装在try 子句中,并使用您在catch 中捕获的错误调用回调。这是一个例子:

    server.get('/api/test', function (req, res, next) {
      process.nextTick(function () {
        try {
          functionWhichWillThrowAnError();
        } catch (error) {
          next(error);
          return;
        }
        res.send('everything is okay!');
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2018-03-23
      • 2017-01-04
      • 1970-01-01
      • 2015-10-13
      • 2011-04-10
      • 2012-02-03
      相关资源
      最近更新 更多