【问题标题】:Can we change the value of attribute on after/before Create() callback in sails?我们可以在 Sails 中的 Create() 回调之后/之前更改属性的值吗?
【发布时间】:2014-06-05 12:13:41
【问题描述】:

我有一个场景,我必须用它的 id 填充模型的属性。例如.. 在用户模型中:

module.exports = {
attributes: {
    activation_link: "string"
},
 afterCreate: function(value, cb) {
    value.activation_link = "localhost:1337/user/action/"+ value.id;
    cb();
}

activation_link 的修改值也必须保存在数据库中。如何实现?

【问题讨论】:

  • 您并没有真正说明您遇到的问题是什么,但我假设您希望您的更改再次保留到数据库中 i> 在afterCreate 通话之后。不是这种情况。返回到User.create()的回调的对象将被修改(即它将有一个activation_link),但数据库记录不会。
  • @sgress454 确切地说,我需要将修改后的值保存在数据库中。如何实现?
  • 对于其他感兴趣的人,我相信这正是@LujaShrestha 所寻找的:stackoverflow.com/a/26618046/2110294

标签: javascript node.js sails.js waterline


【解决方案1】:

根据thisthis,您的代码应该可以正常工作:您在afterCreate 中的操作应该会改变结果对象。

更新

嗯...看起来第一个参数不是 Waterline 对象,尽管有what the documentation says。从技术上讲,您可以通过 id 从 DB 中重新获取记录、更新和保存,而无需太多开销(因为它应该只在创建时调用一次)。但我真的会避免在数据库中放入一个依赖于记录 id 的字段:这样的数据库变得不可传输,因为你不能保证记录将具有相同的 id。因此,解决方案是为这些激活链接使用一些令牌(干净的方式),或者只是将activation_link 设为一个函数而不将其放入数据库(简单的方式):

module.exports = {
  attributes: {
  },
  activation_link: function() {
    if (!this.id)
      return false;

    return 'localhost:1337/user/action/' + this.id;
  }
}

【讨论】:

  • console.log() 操作后显示所需的值,但未保存在数据库中。还需要什么额外的步骤吗?
  • 我建议你可以试试value.save(),因为你在afterCreate,应该不会引起任何循环。
  • @Lujaw 检查更新的答案,如果这样的东西对你有用。
  • 不完全是,我正在寻找的解决方案,它是一个可行的解决方案。感谢@bredikhin的回答
  • 我认为文档/代码被读取错误并且更新的答案不准确。尽管返回水线对象会很好。您在上面列出的任何文档或代码中都没有真正引用它。它只是说传递了值。
【解决方案2】:

afterCreate 更改为 beforeCreate (sails -v 0.12.14)

beforeCreate: function (attrs, cb) {
    attrs.createdAt = moment().format()
    attrs.updatedAt = attrs.createdAt
    return cb();
  },

beforeUpdate: function (attrs, cb) {
    attrs.updatedAt = moment().format()
    return cb();
  }

在此处记录offical sails model lifecycle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2020-07-26
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2023-03-28
    相关资源
    最近更新 更多