如何在自定义覆盖的蓝图操作中调用默认蓝图操作?

how to call default blueprint actions in a custom overridden one?

SailsJS 提供默认的蓝图操作,例如查找、更新、创建等

我需要重写其中一些以满足特定的业务目的。但是,我想添加它们,而不是简单地覆盖它们。如何在覆盖操作中调用默认蓝图操作。

比如update可以更新一个模型的记录

update 

除了更新模型的记录外,我还想让更新做更多的事情。在我的自定义更新方法中,我不想重复默认更新。我该怎么做?

你应该看看 sailsjs 中的 lifecycle callbacks。因此,例如,您可以使用 beforeUpdatebeforeCreate 生命周期回调在模型中执行更多操作:

var bcrypt = require('bcrypt');

module.exports = {

  attributes: {

    username: {
      type: 'string',
      required: true
    },

    password: {
      type: 'string',
      minLength: 6,
      required: true,
      columnName: 'encrypted_password'
    }

  },


  // Lifecycle Callbacks
  beforeCreate: function (values, cb) {

    // Encrypt password
    bcrypt.hash(values.password, 10, function(err, hash) {
      if(err) return cb(err);
      values.password = hash;
      //calling cb() with an argument returns an error. Useful for canceling the entire operation if some criteria fails.
      cb();
    });
  }
};

复制所有内容
PROJECT-ROOT\node_modules\sails\lib\hooks\blueprints\actions

PROJECT-ROOT\config\blueprints

确保 findOne.js 是小写字母。您将需要修改每一个以引用 actionUtil.js 的位置。您现在可以随心所欲地修改这些内容,而无需重新发明轮子。

我刚遇到同样的问题,但找到了不同的解决方法。如果有人遇到同样的问题,它可能会在将来有所帮助。我最后做的是在控制器中重写动作,在我的例子中是 add 然后,在里面做了一些事情之后,调用了默认蓝图的动作。 所以,我的代码如下所示:

add: function (req, res) {
    if (xxx) {
        // I need to do something only when the condition above is met
        Section.count({xxx: xxx)}).exec(function (error, count) {
            if (error) {
                return res.json(500, {error: 'There was an error while trying to run query'});
            }
            //I do what I have to do
            return sails.hooks.blueprints.middleware.add(req, res);
        });
    } else {
        //I just return the default blueprint's action
        return sails.hooks.blueprints.middleware.add(req, res);
    }
}

所以,基本上,默认的蓝图函数存储在: sails.hooks.blueprints.middleware