2015-04-15 12 views
5

Esiste un modo per eseguire un'azione/una funzione prima di tutte e tutte le azioni definite in un controller Sails? Simile ai ganci beforeCreate nei modelli.Prima delle azioni nel controller Sails

Per esempio nel mio DataController, ho le seguenti azioni:

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

Posso fare qualcosa di simile a quanto segue:

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

Dove qualsiasi chiamata a qualsiasi azione definita passerà attraverso la beforeAction primo?

+0

utilizzare le politiche, invece, renderà il codice sia più chiare –

risposta

3

È possibile utilizzare criteri qui.

Ad esempio, creare la vostra politica personalizzata come api/policies/collectParams.js:

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

Than è possibile specificare se questa politica dovrebbe funzionare per tutti i controllori/azioni, oppure solo per quelle specifiche 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' 
    } 
}; 

A volte potrebbe essere necessario sapere qual è il controller corrente (dal codice della politica). Si può facilmente ottenere nel file api/policies/collectParams.js:

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

Ottimo! Grazie. Un'altra aggiunta a questo. È possibile concatenare le politiche in un ordine definito. Come per i documenti invece di aggiungere una politica specifica, puoi aggiungere un array, ad es. per il metodo di modifica 'modifica: ['isAdmin', 'isLoggedIn']' Se un'azione è elencata in modo esplicito, il suo elenco di criteri sovrascriverà l'elenco predefinito. – tuvokki

2

Sì, è possibile utilizzare i criteri come beforeAction.

I documenti mostrano che è utilizzato per l'autenticazione, ma in pratica può essere utilizzato per i propri scopi. Hai appena messo la tua azione prima in una politica.

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

+0

Grazie per il link. Come descritto nella risposta @Leestex, questa sembra la soluzione. – tuvokki

Problemi correlati