Sequelize更新

时间:2017-02-23 11:08:21

标签: node.js sequelize.js

我正在尝试使用以下代码更新Sequelize中的模型:

exports.updateItem = function(item) {
    return new Promise((fulfill, reject) => {
        models.TimesheetItem.update(item,{where: {id: item.id}})
                            .then(fulfill)
                            .catch(console.dir);
     });
};

其中item是执行models.TimeSheetItem.find()

的结果

调用永远不会执行.then而是将空对象传递给.catch。

我查看了文档,似乎这是更新行的方法,但我无法让它工作。我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:15)

根据文档,update方法有两个参数 - 第一个是values,用于执行更新,第二个是options - 所以在你的情况下这个是where子句。如果您只想在单个实例上执行更新,可以通过两种方式执行此操作 - 使用Model.update()方法,该方法可以一次更新此模型的多个实例以匹配where子句,或执行instance.update()以便仅更新单个实例。第一个选项看起来像这样:

let updateValues = { name: 'changed name' };
models.Model.update(updateValues, { where: { id: 1 } }).then((result) => {
    // here your result is simply an array with number of affected rows
    console.log(result);
    // [ 1 ]
});

当您只想更新单个实例时,第一个选项不是很有用。这就是为什么有可能在Sequelize模型实例上执行update()

let updateValues = { name: 'changed name' };
instance.update(updateValues).then((self) => {
    // here self is your instance, but updated
});

在您的情况下,如果item参数是Sequelize模型实例(不是普通的javascript JSON对象),那么您的更新功能可能就是那样

exports.updateItem = function(item){
    return item.update(values).then((self) => {
        return self;
    }).catch(e => {
        console.log(e);
    });
};

但是,如果item不是续集模型实例,而只是具有您想要更新的值的普通对象,则可以通过两种方式完成 - 首先是使用Model.update()(就像你做了),或者第二个是用TimesheetItem检索id = item.id,然后执行instance.update(),如上所示

exports.updateItem = function(item){
    models.TimesheetItem.update(item, { where: { id: item.id } }).then((result) => {
        // here result will be [ 1 ], if the id column is unique in your table
        // the problem is that you can't return updated instance, you would have to retrieve it from database once again
        return result;
    }).catch(e => {
        console.log(e);
    });
};

或者返回实例并对其执行更新的第二个选项

exports.updateItem = function(item) {
    return models.TimesheetItem.findById(item.id).then((itemInstance) => {
        return itemIstance.update(item).then((self) => {
            return self;
        });
    }).catch(e => {
        console.log(e);
    });
}

不同之处在于您不需要创建并返回自己的Promise - 续集方法,例如update()自己返回承诺。

答案 1 :(得分:0)

{ error: type "where" does not exist}

仅是解决方案的更新,当您包含“ where”选项时,Sequelize现在会出现上述错误(如下所示)。因此,将其取出并可以正常使用。

exports.updateItem = function(item){
    models.TimesheetItem.update(item, { id: item.id  }).then((result) => {
        // here result will be [ 1 ], if the id column is unique in your table
        // the problem is that you can't return updated instance, you would have to retrieve it from database once again
        return result;
    }).catch(e => {
        console.log(e);
    });
};