Méthode de contrôle d'accès sails.js à partir de la méthode du contrôleur

Comment venir dans les voiles, vous ne pouvez pas accéder à d'autres méthodes de contrôleur à partir d'un autre?

comme ça.

module.exports = findStore: -> # do somthing index: -> @findStore(); # Error: undefined 

Compilé

 module.exports = { findStore: function() {}, index: function() { return this.findStore(); // Error: undefined } }; 

Si vous ne pouvez pas le faire, alors pourquoi pas? Comment puis-je faire ça …

J'ai le même problème depuis quelques heures. J'ai utilisé le dossier api / services. C'est peut-être pas exactement ce dont vous avez besoin mais c'est une option. Une bonne explication est ici. Quels services ajouterait-on au dossier api / services dans sails.js

Vous pouvez utiliser sails.controllers.yourControllerName.findStore()

L'objet global de sails a des références à presque tout.

L'une des meilleures façons d'organiser votre code dans Sails, au moins pour moi et pour mon équipe, a été d'avoir toute la logique commerciale réelle dans les services (/ api / services). Ces objets peuvent être accessibles globalement à partir de n'importe quel contrôleur.

En outre, une bonne pratique fonctionne avec des promesses de services (comme Sails les utilise sur les méthodes modèles)

Créez simplement un service Store (StoreService.js), avec votre code:

 module.exports = { findStore: function(storeId) { // here you call your models, add object security validation, etc... return Store.findOne(storeId); } }; 

Vos contrôleurs doivent gérer tout ce qui est lié aux demandes, aux services d'appel et au retour des réponses appropriées.

Par exemple, dans votre exemple, le contrôleur pourrait avoir ceci:

 module.exports = { index: function(req, res) { if(req.param('id')) { StoreService.findStore(req.param('id')) .then(res.ok) .catch(res.serverError); } else { res.badRequest('Missing Store id'); } }, findStore: function(req, res) { if(req.param('id')) { StoreService.findStore(req.param('id')) .then(res.ok) .catch(res.serverError); } else { res.badRequest('Missing Store id'); } }, }; 

De cette façon, vous avez vraiment des contrôleurs simples, et toute logique métier est gérée par les services.

Il est légèrement ennuyeux lorsque vous essayez juste de créer quelque chose rapidement, mais à long terme, cela oblige une bonne pratique de l'organisation de code (en rendant plus difficile l'emprise de toute logique métier dans un contrôleur).

Une façon plus élégante de résoudre ce problème est d'utiliser le mot this clé avant le nom de la fonction.

Exemple:

 one: function() { console.log('First Function'); }, two: function() { // call the function one in the same controller this.one(); }