在尝试Sails.js时,我正在编写一个应用程序,该应用程序从第三方API导入数据并将其保存到MySQL表中。基本上,我试图将数据同步到我的应用程序中以进行进一步的分析,更新记录或根据需要创建新记录。

我已经浏览了Sails的API,并且看到了用于查找,创建和更新记录的方法,但是没有内置的方法可以根据情况插入/更新记录。我是否忽略了某些事情,还是需要自己实现?

如果我必须自己实现这一点,那么有人知道插入/更新的良好设计模式吗?

我认为这可能是这样的……

_.each(importedRecords, function(record){
  MyModel.find({id: record.id}).exec(function findCB(err, found){
    if(found.length){
      MyModel.update(record.id, task).exec(function(err, updated){
        if(err) { //returns if an error has occured, ie id doesn't exist.
          console.log(err);
        } else {
          console.log('Updated MyModel record '+updated[0].name);
        }
      });
    }else{
       MyModel.create(record).exec(function(err, created){
         if(err) { //returns if an error has occured, ie invoice_id doesn't exist.
           console.log(err);
         } else {
           console.log('Created client record '+created.name);
         }
       });
     }
   });
 });

我是朝着正确的方向前进,还是有一个更优雅的解决方案?

另外,我在这个应用程序中处理许多不同的模型,这意味着要在我的每个模型中重新创建此代码块。有没有一种方法可以扩展基本Model对象以为所有模型添加此功能。

谢谢,
约翰

最佳答案

我已经重写了关键的Mash代码,因此它的代码更少,并且更加通用。
现在,您可以像调用findOrCreate一样调用updateOrCreate。它看起来像这样:

module.exports.models = {
    updateOrCreate: function(criteria, values){
        var self = this; // reference for use by callbacks
        // If no values were specified, use criteria
        if (!values) values = criteria.where ? criteria.where : criteria;

        return this.findOne(criteria).then(function (result){
          if(result){
            return self.update(criteria, values);
          }else{
            return self.create(values);
          }
        });
    }
};

这样,您可以以相同的方式编写条件。无需处理 key ,并且代码非常简单。

关于javascript - Sails.js模型-插入或更新记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25936910/

10-11 05:26