11
votes

Comment appeler des actions de plans de défaillance par défaut dans une mesure sur mesure

Sailsjs propose des actions de plans par défaut, telles que la recherche, la mise à jour, la création, etc.

J'ai besoin de remplacer certaines d'entre elles pour convenir à des fins commerciales particulières. Cependant, je voudrais y ajouter, au lieu de les simplifier simplement. Comment appeler les actions de planplint par défaut dans l'action primordiale. P>

Par exemple, la mise à jour peut mettre à jour l'enregistrement d'un modèle. P>

update 


0 commentaires

3 Réponses :


3
votes

Vous devriez regarder Callbacks de cycle de vie à Sailsjs. Donc, par exemple, vous pouvez utiliser avant-déjeuner code> ou Beforecree code> Callback de cycle de vie pour faire plus dans le modèle:

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


2 commentaires

J'ai essayé avant-déjeuner de la vie du cycle de vie. Mais quand je posterai à un modèle, par exemple Post / ABC où ABC est le modèle, Brevenumdate est également déclencheur. Pourquoi donc?


Je pense que ça ne devrait pas. Avez-vous également un Beforecree rappel? Vous pouvez peut-être éditer et sauver un modèle là-bas sans utiliser le rappel fourni qui déclenche avant-déjeuner ?



3
votes

Tout copier à partir de xxx

à xxx

Assurez-vous que la recherche est en minuscule. Vous devrez modifier chacun pour faire référence à l'emplacement de actionutil.js . Vous pouvez maintenant les modifier sur votre contenu de votre cœur sans réinventer la roue.


4 commentaires

Comment faire de ces actions primordiales différentes pour différents modèles?


Ça dépend. Si vous avez de vastes différences entre les modèles, vous ne voulez probablement pas utiliser des plans du tout. Dans votre contrôleur, vous pouvez simplement ajouter une seule méthode pour écraser une seule action et laisser le reste intact. Donc, pour le modèle utilisateur, je pourrais créer une méthode de "mise à jour" sur ce contrôleur et écrasera simplement ce plan et laisser le reste intact. Toutefois, si vos différences sont petites, vous pouvez identifier vos modèles à l'intérieur des fichiers de planimint et effectuer des ajustements si nécessaire.


J'ai essayé votre solution mais je ne pouvais pas le faire fonctionner. Pendant la procédure de levage, j'ai eu l'erreur un crochet ('userconfig') n'a pas réussi à charger! .


gist.github.com/mphasize/e9ed62f9d139D2152445 La stratégie avantblueprint peut avoir un sens



10
votes

Je viens de tomber sur le même problème et j'ai trouvé une autre façon de le réparer. Cela peut aider à l'avenir si quelqu'un a le même problème. Ce que j'ai enfin fait était de ré-écrire l'action dans le contrôleur, dans mon cas, c'était Ajouter CODE>, puis, après avoir fait des trucs à l'intérieur, appelé l'action de Blueprint par défaut. Donc, mon code ressemble ci-dessous:

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


5 commentaires

Cela a répondu à la question pour moi. Merci


pouces pour cela vous êtes un champion :)


Prendre en compte toutes les fonctions de Sails.hooks.blueprints.middleware ont des noms minuscules (par exemple, FindOne )


Supposé que dans mon contrôleur j'appelle saishants.hooks.blueprints.middleware.findone (req, res); Comment puis-je obtenir l'objet de modèle avant est renvoyé au client ?


Sails.hooks.blueprints.Middleware Ne semble avoir aucun de ceux-ci (trouver, trouver, figure, etc.). Une idée où ils ont été déplacés? La solution de contournement est à requiert ({$ {Sails.config.appPath} / node_modules / Sails / Lib / Hook S / Blueprints / $ {Actio N}} `) , mais pas idéal du tout. ..