0

考虑以下代码:

mongoose.connect('MyDatabaseURL');
var sch_obj = {field1: String};
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    var model_obj = db.model('SchemaName', sch_obj);
    var obj = new model_obj({field1:'MyValue'});
    obj.save(function(err,data){
      if(err) 
         console.log('error occurred:' + err);   // <=== Case 1
      else
         console.log('saved'); 
      });
});

/* ----------------------------------  */

mongoose.connect('MyDatabaseURL');
var sch_obj = {field1: String};
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    var model_obj = db.model('SchemaName', sch_obj);
    var obj = new model_obj({field1:'MyValue'});
    obj.save(function(err,data){
      try {
          console.log('saved');
      }
      catch(err)                            // <=== Case 2
      {
        console.log('error occurred:' + err);
      }
    });
});

问题:它们是一样的吗?如果是,哪一种是处理错误的好方法?

4

1 回答 1

0

不,它们不一样。Mongoose newer 抛出错误,所以你会更新捕获一个。这就是为什么你不能使用try ... catch ...语句来处理猫鼬错误。

所以,唯一正确的方法是:

obj.save(function(err,data){
  if(err)
     console.log('error occurred:' + err);
  else
     // err == null
     console.log('saved'); 
  });

其背后的原因是throw终止当前进程,除非它被捕获。因此,大多数 nodejs 模块(例如expressmongoose等)使用回调而不是抛出它们来传递它们的错误,这是 nodejs 中的常见做法。

于 2013-02-14T10:09:06.187 回答