1

次のコードを見てみましょう。

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

私の質問は、コールバックが渡されるときに常に「エラー、リソース」を実行するのはなぜですか

エラーを処理しているため、 2 *に到達することさえできません。

3および4と同様に、エラーは別のレイヤーで処理されるため、常に NULL になります。なぜ私は5でこれをやらないのでしょうか:

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

  return callback(collection);
});

errorHandler 関数は主要なエラーを処理する関数になるため、各レイヤーでそれらを使用する必要はありません。たとえば、mongodb.findOne の場合と同じ話ですが、コールバックを渡すときにエラーを処理する必要があるのはなぜですか?

4

1 に答える 1

2

callback(error,result)私は主に、エラーがどこにもスローされない (またはキャッチされない) 場合にこのパターンを使用します。つまり、パラメーターが欠落しているという理由だけでアプリケーションを停止したくないということです。次のコードを見てください。

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);
  };
};
于 2012-08-23T14:58:56.463 に答える