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


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

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

例如,update可以更新模型的记录。

update 

除了更新模型的记录之外,我希望更新做得更多。在我的自定义更新方法中,我不想复制默认更新。我怎样才能做到这一点?


1246
2018-01-28 23:15


起源



答案:


复制一切

PROJECT-ROOT\node_modules\sails\lib\hooks\blueprints\actions

PROJECT-ROOT\config\blueprints

确保findOne.js是小写的。您需要修改每个参考位置 actionUtil.js。您现在可以在不重新发明轮子的情况下修改这些内容。


3
2018-01-29 15:33



如何使不同模型的覆盖动作不同? - windchime
这取决于。如果模型之间存在巨大差异,那么您可能根本不想使用蓝图。在您的控制器中,您只需添加一个方法来覆盖单个操作,其余部分保持不变。因此对于User模型,我可以在该控制器上创建一个“更新”方法,它将覆盖该蓝图并保持其余部分不变。但是,如果您的差异很小,那么您可以在蓝图文件中识别模型并根据需要进行调整。 - Meeker
我已经尝试过您的解决方案,但无法使其正常运行。在升降过程中,我收到了错误 A hook ('userconfig') failed to load!。 - Yann Bertrand
gist.github.com/mphasize/e9ed62f9d139d2152445 beforeBlueprint政策可以有意义 - Crusader


答案:


复制一切

PROJECT-ROOT\node_modules\sails\lib\hooks\blueprints\actions

PROJECT-ROOT\config\blueprints

确保findOne.js是小写的。您需要修改每个参考位置 actionUtil.js。您现在可以在不重新发明轮子的情况下修改这些内容。


3
2018-01-29 15:33



如何使不同模型的覆盖动作不同? - windchime
这取决于。如果模型之间存在巨大差异,那么您可能根本不想使用蓝图。在您的控制器中,您只需添加一个方法来覆盖单个操作,其余部分保持不变。因此对于User模型,我可以在该控制器上创建一个“更新”方法,它将覆盖该蓝图并保持其余部分不变。但是,如果您的差异很小,那么您可以在蓝图文件中识别模型并根据需要进行调整。 - Meeker
我已经尝试过您的解决方案,但无法使其正常运行。在升降过程中,我收到了错误 A hook ('userconfig') failed to load!。 - Yann Bertrand
gist.github.com/mphasize/e9ed62f9d139d2152445 beforeBlueprint政策可以有意义 - Crusader


我刚刚遇到同样的问题,并找到了一种不同的方法来解决它。如果有人遇到同样的问题,将来可能有所帮助。我最后做的是在控制器中重写动作,就我而言 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


9
2017-08-30 19:08



这回答了我的问题。谢谢 - burntblark
大拇指你是冠军:) - Vjeran Magister Ludi
考虑到所有功能 sails.hooks.blueprints.middleware 有小写名称(例如 findone) - GMunguia
假设在我的控制器中我打电话 sails.hooks.blueprints.middleware.findone(req, res);  我怎样才能获得模型对象 之前 被送回客户端? - lrkwz
sails.hooks.blueprints.middleware 似乎没有任何(找到,找到,找到等)。知道他们搬到哪里了吗?解决方法是 require(`${sails.config.appPath}/node_modules/sails/lib/hooks/blueprints/${action}`),但根本不理想...... - Vladyslav at AssuredLabs


你应该看看 生命周期回调 在sailsjs。例如,您可以使用 beforeUpdate 要么 beforeCreate 生命周期回调在模型中做更多:

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();
    });
  }
};

3
2018-01-29 13:25



我尝试过beforeUpdate生命周期回调。但是当我发布到模型时,例如POST / abc其中Abc是模型,beforeUpdate也是触发器。这是为什么? - windchime
我认为不应该。你还有吗? beforeCreate 回电话?也许您正在编辑并保存模型而不使用触发提供的回调 beforeUpdate? - r0hitsharma