Sequelize Update,Create Hook和Literal Date

时间:2017-03-02 16:41:35

标签: sequelize.js

在Sequelize中,我有一个模型WorkFile,它具有以下实例方法

workfile.update({ path: '/path/to/here' }).then(result => {
  return result;
})

result包含以下内容

外,此方法效果很好
{
  "created_at": "2017-03-02T16:32:42.542Z",
  "updated_at": {
    "val": "NOW()"
  },
  // etc
}

更新方法有效,但updated_at仍然是db文字。 只有在模型中有afterCreate挂钩时才会发生。我尝试了workfile.get()workfile.get({ plain: true })。我设法做的唯一工作就是重新查询数据库中的对象,这看起来很荒谬。有没有办法在没有文字updated_at?

的情况下访问该对象

被修改

这是钩子:

afterCreate: function(workfile, options, cb) {
    return workfile.update({
            path: `path/with/${workfile.id}`
        })
        .then(wf => cb(null, workfile)) // <--workfile and wf both have literal updated_at
        .catch(err => cb(err)); 
}

2 个答案:

答案 0 :(得分:0)

对于未来的人来说,在我的模型中,我使用的是Sequelize.literal('NOW()')。当我用Sequelize.NOW替换它时,问题就消失了。不完全确定原因,但它可以作为修复工具!

答案 1 :(得分:-1)

您正在调用workfile.update(),它返回0位置中已更改行数的数组以及1位置中受影响的行数。您正在查看Model而不是Instance这就是您看到&#34; NOW()&#34; - 它将在DB和每个实例中转换为日期时间。

在您的afterCreate功能中,您接受了branch实例,然后在workfile模型上,在没有update()的情况下呼叫WHERE,这样它就会更新workfile模型表中的所有行。你也得到一个数组,而不是上面提到的实例。

目前还不清楚branch是否为workfile,但如果您想更改特定实例/行的属性,则应使用:

// change the "path" on the "branch" Instance after each create
afterCreate: function(instance) {
  // "instance" is an Instance of a "workfile" Model
  instance.path: `path/with/${instance.id}`;
  // call Instance.save() on the "instance" variable it after you set the property.
  return instance.save();
}

如果您确实想要更新所有workfile,无论branch是什么,您都可以使用以下

// change the "path" on ALL "workfile" rows, displaying the results.
afterCreate: function() {
  return workfile.update({ path: `path/with/${workfile.id}` })
  .then(result => {
    console.log(`Updated ${result[0]} rows`);
    console.log('Affected rows:', result[1]);

    // since we are printing out the result here we also
    // need to return in in a Promise
    return Promise.resolve(result);
  })
  .catch(err => console.log("Error!", err));
}

您不需要包含您不使用的功能参数,默认情况下Sequelize使用Promises,因此您只需返回update() / save()而不是使用回调。

另一种选择是使用VIRTUAL字段而不是将其存储在数据库中,因为您真正需要的是ID

Sequelize.define('model', {
  path: {
    type: DataTypes.VIRTUAL,
    get: function getType() {
      return `path/with/${this.id}`;
    },
  }
);