【问题标题】:Node.js proper callback error handleNode.js 正确的回调错误句柄
【发布时间】:2012-08-23 22:58:56
【问题描述】:

让我们看看下面的代码:

mongodb.js

var mongo = require('mongodb')
  , mongodb = module.exports;

mongodb.database = function(key, dbName, dbServer, callback){
  var db = new mongo.Db(dbName, dbServer);
  db.open(function(error, connection){ // 5
    if(error){ // 1
      throw error;
    }

    return callback(null, connection);
  });
};

mongodb.collection = function(dbKey, collName, callback){
  mongodb.database(dbKey, function(error, connection){
    connection.collection(collName, function(error, collection){ // 2
      if(error){ // 3
        throw error;
      }

      return callback(null, collection);
    });
  });
}

model.js

var db = require('./mongodb.js');
var model = module.exports;

model.test = function(callback){
  db.collection('users', function(error, collection){ // 4
    // do something.
  });
}

我的问题是,为什么我们在传递回调时总是做“错误,资源”,因为,看看1

我们正在处理错误,所以它甚至无法达到 2*

34 相同,它们将始终为 NULL,因为错误是在不同的层。现在我为什么不在 5 这样做:

db.open(function(error, connection){
  if(error){ // 1
    return errorHandler(error);
  }

  return callback(collection);
});

errorHandler函数将是一个处理重大错误的函数,所以我们不必在每一层都使用它们,同样的故事例如mongodb.findOne,为什么我们在传入时必须处理错误回调?

【问题讨论】:

    标签: javascript node.js callback


    【解决方案1】:

    我使用callback(error,result) 模式主要是在错误没有被抛出(或捕获)的情况下。 IE。您不想仅仅因为缺少一些参数而停止您的应用程序。看下面的代码:

    function somethingAsync (options, callback) {
      if (!options || !options.name) {
        callback('no name specified'); //we dont want to kill the Application
        return;
      };
      doSomeThingInternal(callback);
    };
    

    在消费者方面,您可以从任何内部函数将错误打印到客户端。

    somethingAsync(null, function (err,res)) {
      if(err) {
        console.log('error occured: ' + err);
      };
    };
    

    【讨论】:

    • 您仍然可以捕获“未捕获”异常,因此应用程序不会停止。这就是为什么我提到“errorHandler(error)”,其中“errorHandler”是一个处理错误的函数。当数据库错误很严重时,我只是看不到传递错误的意义,而不是因为参数或其他原因。
    • 我几乎 100% 使用的一个常见模式是在每个回调的顶部有 "if(err) return callback(err); 。然后,错误将只在一个位置并冒泡到那里。它还让我“注入”其他错误,例如“if(res.length == 0) return callback(new Error('no items'));”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多