如何在不触发模型生命周期回调的情况下更新SailsJS中的记录

How to update record in SailsJS without triggering model lifecycle callbacks

本文关键字:情况下 回调 更新 SailsJS 记录 周期 生命 模型      更新时间:2023-09-26

我有一个模型,在更新或将新记录保存到表后,我需要重建记录。问题是在fixTree进行更新时触发了afterUpdate回调。

module.exports = {
  identity: 'Role',
  attributes: {
    ..
  },
  afterCreate: function(rec, cb) {
    fixTree();
    cb();
  },
  afterUpdate: function(rec, cb) {
    fixTree();
    cb();
  },
}
function fixTree() {
  /* code here */
  Role.update(....); // <--- do not trigger afterUpdate
  /* and code here */
}

我最终使用了控制器动作

create: function(req, res) {
    var data = {};
    data.name = req.body.name;
    data.parent = req.body.parent;
    Role.create(data, function(err, record) {
        Role.tree.fix(function() {
            res.ok(record);
        });
    });
},
update: function(req, res) {
    var data = {};
    data.name = req.body.name;
    data.parent = req.body.parent;
    Role.update(req.params.id, data, function(err, record) {
        Role.tree.fix(function() {
            res.ok(record);
        });
    });
},

您可以添加一个标志来监控是否正在进行树更新:

var fixTreeInProgress = false;
module.exports = {
  identity: 'Role',
  attributes: {
  //..
  },
  afterCreate: function(rec, cb) {
    if (!fixTreeInProgress) {
      fixTree();
    }
    cb();
  },
  afterUpdate: function(rec, cb) {
    if (!fixTreeInProgress) {
      fixTree();
    }
    cb();
  },
}
function fixTree() {
  /* code here */
  fixTreeInProgress = true;
  //passing callback to clear out flag when update is complete
  Role.update(criteria, updatedRecords, function fixTreeUpdateCallback() {
    fixTreeInProgress = false;
  }); // <--- do not trigger afterUpdate
  /* and code here */
}

但请记住:如果在Role.update进行期间,数据将在另一个请求中更新,则会使您的数据不一致:

考虑这样的场景:

  1. 应用程序收到数据更新请求
  2. 控制器更新数据,调用生命周期回调
  3. fixTreeInProgress var为false,因此我们启动fixTree(),并将fixTreeInProgress设置为true
  4. 应用程序又收到一个数据更新请求
  5. 控制器更新数据,调用生命周期回调,fixTreeInProgress var为true,因此我们启动fixTree()
  6. Role.update()完成,fixTreeInProgress设置为false

在这种情况下,我们将使用旧版本的数据更新树。

您需要使用某种任务队列(以及可选的某种反跳功能)来处理这种情况。