【问题标题】:Will there be any conflit with error object thrown from mongoose.save() on try-catch blocks?mongoose.save() 在 try-catch 块上抛出的错误对象是否会发生冲突?
【发布时间】:2013-02-14 18:21:48
【问题描述】:

考虑以下代码:

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

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    不,它们不一样。 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 中的常见做法。

    【讨论】:

    • @AmolMKulkarni,有关正确错误处理的更多示例,请参阅 Mongoose Docs
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多