【问题标题】:Sails.js model updatedAt (updated_at) not auto updatingSails.js 模型 updatedAt (updated_at) 不自动更新
【发布时间】:2016-08-25 21:03:24
【问题描述】:

预期行为:

使用.update() 成功更新记录后,记录的updated_at 字段应自动更新为当前时间。

注意:我在 config.models 中使用autoUpdatedAt: 'updated_at' 更改了autoUpdatedAt 设置(也提到了here),因此该字段的标题为updated_at 而不是updatedAt。它应该仍然具有我假设的相同功能。

实际行为:

模型更新成功,但没有更新updated_at字段。

代码运行:

model.update(primary, data)
.then(function updateCB(updated){
  // error handling
  sails.log('Updated successfully');
  sails.log(updated);
});

问题:

  • 这是为什么呢?
  • 我该如何解决这个问题?

结果:Sails 问题

我能够在一个新项目中重现它,所以它看起来像是风帆的问题。问题链接:https://github.com/balderdashy/sails/issues/3821

请参阅下面的答案以获取更多信息。

【问题讨论】:

  • 你能展示一下updated_at 属性在你的模型文件中的样子吗?
  • 不是模型文件中的属性;这是一个重命名 autoUpdatedAt 属性的帆级命令 - 我在注释中链接了它。
  • 啊,你的问题:)
  • 哈哈我希望它是那么简单:) 但是重命名它不应该撤消它的功能。 create_at 完美运行。
  • 我用第三个选项更新了我的答案,灵感来自我实际上对bcrypt 所做的事情。

标签: javascript sails.js waterline


【解决方案1】:

我无法回答“为什么”我尝试了同样的事情并遇到了同样的问题。至于怎么解决——

我在我的模型文件中为我想要的任何模型设置了一个属性,并像这样填写它:

    updated_at:{
        type: 'datetime',
        defaultsTo: function(){return new Date();}
    }

将我的数据库中的列(在本例中为 mysql)设置为 NOT NULLDATETIME 并设置为更新 CURRENT_TIMESTAMP on UPDATE

如果您无权访问数据库,也可以在更新调用之前将其放入代码中:

data.updated_at = new Date();
model.update(primary,data)....

这将完成同样的事情。

这是我能想到的最简单的解决方法。

我想到了这个,我想出了第三个选项,一个模型方法,如下所示:

attributes:{
    //stuffs
},
beforeUpdate: function(obj, next){
    obj.updated_at = new Date();
    return next(null, obj);
}

null 在第一个位置是因为据我所知,Sails 期望在整个调用链中都有一个 error 对象,所以如果我什么都不传递,那么整个事情就会失败。

【讨论】:

  • 您确定这适用于更新吗?它将在创建时设置默认值,因此适用于created_at,但我不确定是否要更新。显然我更喜欢配置解​​决方案,但在 Sails 修复它之前,我愿意接受手动解决方案。
  • @smileham,哦,opps,我忘了一步,有两种方法可以处理这个问题。因为我可以完全控制我的项目,所以我在 db 级别进行了操作,但您也可以在代码中进行操作,也可以查看我的编辑。
  • 明白了。但是,在更新时,updated_at 会更改值吗?它在创建时就已经有了一个值。
  • 来自sails 文档:defaultsTo - 创建记录时,如果未提供任何值,则将使用指定的defaultsTo 值创建记录。提供的值也可以是水线在创建记录时运行的函数。
  • 知道了!编辑是有道理的,谢谢你。是的,在我每次调用.update() 之前,我都可以手动设置updated_at,但这首先消除了自动更新的优势,因为它现在本质上是一个静态属性(我宁愿不经历我所有的代码来改变它)。尽管如此,仍然有两个很好的解决方案 - 我很感激。我先试试 DB 路由。
【解决方案2】:

结果:Sails 问题

我能够在一个新项目中重现它,所以它看起来像是风帆的问题。问题链接:https://github.com/balderdashy/sails/issues/3821

代码运行:

Test.create()
.then(function(created){
    sails.log('created');
    sails.log(created);

    Test.update(created, {})
    .then(function(updated){
        sails.log('updated');
        sails.log(updated[0]);

        Test.findOne(updated)
        .then(function(found){
            sails.log('found');
            sails.log(found);

            res.end();
        });
    });
});

代码结果:

debug: created
debug: { createdAt: '2016-08-25T21:35:46.679Z',
  updated_at: '2016-08-25T21:35:46.679Z',
  id: 1 }
debug: updated
debug: { createdAt: '2016-08-25T21:35:46.679Z',
  updated_at: '2016-08-25T21:35:46.679Z',
  id: 1,
  updatedAt: '2016-08-25T21:35:46.698Z' }
debug: found
debug: { createdAt: '2016-08-25T21:35:46.679Z',
  updated_at: '2016-08-25T21:35:46.679Z',
  id: 1,
  updatedAt: '2016-08-25T21:35:46.698Z' }

看起来 Sails 仍在添加一个未保存到我的 SQL 数据库中的 updatedAt 字段。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多