2015-04-15 68 views
5

在Sails控制器中定義的每個和所有操作之前是否有一種方法可以執行操作/函數?類似於模型中的beforeCreate掛鉤。在Sails控制器中執行操作之前

舉例來說,在我的DataController類,我有下列行爲:

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

我可以這樣做以下:

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

凡定義的任何行動電話將通過控制器的beforeAction第一?

+0

使用政策相反,它會使你的代碼看起來更清晰 –

回答

3

你可以在這裏使用的政策。

例如,創建自定義政策api/policies/collectParams.js

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

比你可以指定這個政策應該在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' 
    } 
}; 

有時您可能需要知道,當前控制器(來自您的策略代碼)是什麼。你可以很容易地得到它在你的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

太棒了!謝謝。 此外還有一個補充。可以按照定義的順序鏈接策略。根據文檔而不是添加特定的策略,您可以添加一個數組,例如編輯方法:['isAdmin','isLoggedIn'] 如果某個操作被明確列出,其策略列表將覆蓋默認列表。 – tuvokki

2

是的,您可以使用政策作爲beforeAction。

該文檔顯示其用於身份驗證,但它可以基本上用於您的目的。你只是把你的行動之前放在一個政策。

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

+0

感謝您的鏈接。正如@Leestex中所述,答案看起來像解決方案。 – tuvokki

相關問題