web-dev-qa-db-fra.com

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

Comment se fait-il que vous ne puissiez pas accéder à d’autres méthodes de contrôleur depuis une 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 faire cela, alors pourquoi pas? sinon comment devrais-je faire cela ...

15
iConnor

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

7
lloop

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

l'objet global sails fait référence à presque tout.

64
nidheeshdas

L'un des meilleurs moyens d'organiser votre code dans Sails, du moins pour moi et mon équipe, a été de disposer de toute la logique métier réelle dans Services (/ api/services). Ces objets peuvent être accessibles globalement à partir de n’importe quel contrôleur.

Aussi, une bonne pratique consiste à travailler avec des promesses dans les services (comme les voiles les utilisent 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 concerne les demandes, les services d’appel et le 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 manière, vous avez des contrôleurs très simples et toute la logique métier est gérée par des services.

24
Luis Lobo Borobia

C’est un peu gênant d’essayer de construire rapidement quelque chose, mais à long terme, cela impose une bonne pratique d’organisation du code (il est plus difficile de transférer toute la logique métier dans un contrôleur).

2
Josh Liptzin

Je voudrais suggérer une solution qui fonctionne mais pas la meilleure façon de le faire. Nous pouvons utiliser la fonction bind pour lier le contexte à la source appelante comme indiqué ci-dessous:

generateUrl est présent dans le contrôleur A

function generateUrl(){
  return 'www.google.com';
}

obtenir l'URL est une autre méthode dans le contrôleur A

getURL(){
  A.generateURL.bind(A.generateURL) //func call with optional arg
}

J'espère que ça aide!

1
monothorn

Un moyen plus élégant de résoudre ce problème consiste à utiliser le mot clé this 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();
}
0
Marcos Mendes

Vous pouvez faire quelque chose comme ça:

//ArticleController
module.exports = {
  findStore: async () => {
    return await findStoreFunc(req.param('id'));
  },
  index: async () => {
    ...
    return await findStoreFunc(id);
  }
};

const findStoreFunc = async (id) => {...}

Et pour utiliser la fonction d’un autre contrôleur:

const ArticleController = require('./ArticleController');
//CustomerController
module.exports = {
  index: async () => {
    ...
    let article = await ArticleController.findStore(id);
    ...
  }
};
0
Marcell