2015-04-15 14 views
5

Gibt es eine Möglichkeit, eine Aktion/Funktion vor allen Aktionen auszuführen, die in einem Sails-Controller definiert sind? Ähnlich wie die beforeCreate Haken in den Modellen.Vor Aktionen in Sails-Controller

Zum Beispiel in meinem Datacontroller, habe ich die folgenden Aktionen:

module.exports = { 
    mockdata: function(req, res) { 
    var criteria = {}; 

    // collect all params 
    criteria = _.merge({}, req.params.all(), req.body); 
    //...some more login with the criteria... 
    }, 
    getDataForHost: function(req, res) { 
    var criteria = {}; 

    // collect all params 
    criteria = _.merge({}, req.params.all(), req.body); 
    //...some more login with the criteria... 
    } 
}; 

Kann ich so etwas wie die folgenden Möglichkeiten:

module.exports = { 
    beforeAction: function(req, res, next) { 
    var criteria = {}; 

    // collect all params 
    criteria = _.merge({}, req.params.all(), req.body); 
    // store the criteria somewhere for later use 
    // or perhaps pass them on to the next call 
    next(); 
    }, 

    mockdata: function(req, res) { 
    //...some more login with the criteria... 
    }, 
    getDataForHost: function(req, res) { 
    //...some more login with the criteria... 
    } 
}; 

Wo jeder Anruf auf eine beliebige definierte Aktion wird die beforeAction passieren zuerst?

+0

Nutzungsrichtlinien statt, es wird Ihr Code sieht klarer –

Antwort

3

können Sie Richtlinien hier verwenden.

Zum Beispiel erstellen Sie Ihre benutzerdefinierte Richtlinie als api/policies/collectParams.js:

module.exports = function (req, res, next) { 
    // your code goes here 
}; 

als Sie, wenn diese Richtlinie angeben kann, sollte für alle Controller/Aktionen arbeiten, oder nur für bestimmte diejenigen in config/policies.js:

module.exports.policies = { 
    // Default policy for all controllers and actions 
    '*': 'collectParams', 

    // Policy for all actions of a specific controller 
    'DataController': { 
     '*': 'collectParams' 
    }, 

    // Policy for specific actions of a specific controller 
    'AnotherController': { 
     someAction: 'collectParams' 
    } 
}; 

Manchmal müssen Sie möglicherweise wissen, was der aktuelle Controller ist (aus Ihrem Richtliniencode). Sie können es leicht in Ihre api/policies/collectParams.js Datei erhalten:

console.log(req.options.model);  // Model name - if you are using blueprints 
console.log(req.options.controller); // Controller name 
console.log(req.options.action);  // Action name 
+0

Großartig! Vielen Dank. Eine weitere Ergänzung dazu. Es ist möglich, Richtlinien in einer bestimmten Reihenfolge zu verketten. Gemäß den Dokumenten können Sie, anstatt eine bestimmte Richtlinie hinzuzufügen, ein Array hinzufügen, z. zur Editiermethode 'edit: ['isAdmin', 'isLoggedIn']' Wenn eine Aktion explizit aufgelistet wird, überschreibt ihre Richtlinienliste die Standardliste. – tuvokki

2

Ja, Sie können Richtlinien als afterAction verwenden.

Die Dokumente zeigen, dass es für die Authentifizierung verwendet wird, aber es kann grundsätzlich für Ihre Zwecke verwendet werden. Sie legen Ihre Aktion in eine Richtlinie.

http://sailsjs.org/#!/documentation/concepts/Policies

+0

Danke für den Link machen. Wie in @Leestex beschrieben, sieht das wie die Lösung aus. – tuvokki

Verwandte Themen