使用Sequelize创建/更新项目阵列



我创建了一个函数:

  • 取一个"标签"数组,查看它们是否已经在数据库中有记录
  • 创造那些不存在的
  • 并更新那些确实存在的
  • 返回一个json数组,报告每个项,无论它们是更新/创建的,还是导致错误

我设法做到了,但我觉得我只是做了一些丑陋的狗的晚餐!

var models = require("../models");
var Promise = models.Sequelize.Promise;
module.exports = {
    addBeans: function (req, callback) {
        Promise.map(req.body.beansArr, function (bean) {
            return models.Portfolio.findOrCreate({where: {label: bean}}, {label: bean});
        }).then(function (results) {   // Array of 'instance' and 'created' for each bean "findOrCreate(where, [defaults], [options]) -> Promise<Instance>"
            var promisesArr = [];
            results.forEach(function (result) {
                if (result[1]) {   // result[1] = wasCreated
                    promisesArr.push(Promise.resolve([result[0].dataValues.label, "created"]));   
                } else {
                    promisesArr.push(
                        models.Portfolio.update({label: result[0].dataValues.label},
                            {where: {label: result[0].dataValues.label}}).then(function () {
                                return Promise.resolve([result[0].dataValues.label, "updated"])
                            })
                    );
                }
            }); 
            return promisesArr;
        // When it's all done create a JSON response
        }).then(function (results) {
            var resultObj = {items: []};  // JSON to return at the end
            Promise.settle(results).then(function (promiseinstances) {
                for (var i = 0; i < promiseInstances.length; i++) {
                    if (promiseInstances[i].isFulfilled()) {
                        resultObj.items.push({
                            item: {
                                label: promiseInstances[i].value()[0],
                                result: promiseInstances[i].value()[1],
                                error: ''
                            }
                        });
                    }
                    else if (promiseInstances[i].isRejected()){
                        resultObj.items.push({
                            label: promiseInstances[i].value()[0],
                            result: 'error',
                            error: promiseInstances[i].reason()
                        });
                    }
                }
            // Send the response back to caller
            }).then(function () {
                return callback(null, resultObj);
            }, function (e) {
                return callback(e, resultObj);
            });
        });
    }
};

问题:

  • 有没有一种更简单或更明显的方法可以通过Sequelize创建/更新价值
  • 我使用Promise.settle()是否适合这种情况?我有一种感觉,我让这件事变得比它需要的更复杂

我是Sequelize和Promises的新手,如果有人能就此提供建议,我将不胜感激。

我觉得这在CodeReview.SE上会更好地工作,但我可以看到一些问题。

有没有一种更简单或更明显的方法可以通过Sequelize创建/更新价值?

好吧,有一件事:

.then(function(array){
   var newArr = [];
   array.forEach(function(elem){
       newArr.push(fn(elem);
   }
   return newArr;
});

只是

.map(fn)

此外,承诺同化,这样你就可以从.thenreturn val;,而不必return Promise.resolve(val);

因此:

).then(function (results) {   // Array of 'instance' and 'created' for each bean "findOrCreate(where, [defaults], [options]) -> Promise<Instance>"
    var promisesArr = [];
    results.forEach(function (result) {
        if (result[1]) {   // result[1] = wasCreated
            promisesArr.push(Promise.resolve([result[0].dataValues.label, "created"]));   
        } else {
            promisesArr.push(
                models.Portfolio.update({label: result[0].dataValues.label},
                    {where: {label: result[0].dataValues.label}}).then(function () {
                        return Promise.resolve([result[0].dataValues.label, "updated"])
                    })
            );
        }
    }); 
    return promisesArr;
})

只是

.map(function(result){
     if(result[1]) return [result[0].dataValues.label, "created"];
     return  models.Portfolio.update({label: result[0].dataValues.label},
                    {where: {label: result[0].dataValues.label}}).
                    return([result[0].dataValues.label, "updated"]);
 });

然而,既然你想让它工作,不管它被解决了,你就必须这样做:

.then(function(results){
     return results.map(function(result){
     if(result[1]) return [result[0].dataValues.label, "created"];
     return  models.Portfolio.update({label: result[0].dataValues.label},
                    {where: {label: result[0].dataValues.label}}).
                    return([result[0].dataValues.label, "updated"]);
 });
 });

这意味着它无论如何都会解决,然后你会调用.settle():

.settle().then(function(results){
     // your settle logic here
});

注意最后一个:

}).then(function () {
    return callback(null, resultObj);
}, function (e) {
    return callback(e, resultObj);
});

简单来说就是:

.nodeify(callback);

然而,我建议你坚持承诺。

我使用Promise.ssettle进行sequelize.update,并可以通过_settledValueField获得影响行数。

promise.push(...update...)
db.sequelize.Promise.settle(promise).then(function (allresult) {
    var affectcnt = 0
    allresult.forEach(function (singlecnt) {
      if (undefined !== singlecnt._settledValueField[1]) {
        affectcnt += parseInt(singlecnt._settledValueField[1])
      }
    })

不幸的是,这只是为了更新。

您可以使用sequelize在数据库中插入数组。您想要更改模型,如下所示。我正试图通过数组在数据库中添加多种语言。

language: { type: DataTypes.STRING, 
          allowNull: false,
          get() 
         { 
         return this.getDataValue('language').split(';') 
         }, 
        set(val)
        {
        this.setDataValue('language',Array.isArray(val) ? val.join(','):val);
      }
  }   

最新更新