Метод управления доступом sails.js от метода контроллера

Как в парусах вы не можете получить доступ к другим методам контроллера из другого?

как это.

module.exports = 

   findStore: ->
       # do somthing

   index: ->
      @findStore(); # Error: undefined

Составитель

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

Если вы не можете этого сделать, тогда почему? как еще я должен это делать...

Ответы

Ответ 2

Вы можете использовать sails.controllers.yourControllerName.findStore()

Глобальный объект sails имеет ссылки на почти все.

Ответ 3

Один из лучших способов организовать ваш код в Sails, по крайней мере для меня и моей команды, - это иметь всю реальную бизнес-логику в Services (/api/services). Доступ к этим объектам можно получить глобально с любого контроллера.

Кроме того, хорошая практика работает с promises в сервисах (поскольку Sails использует их в методах модели)

Просто создайте службу Store (StoreService.js) с кодом:

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

Ваши контроллеры должны обрабатывать все, что связано с запросами, вызовами служб и возвратом соответствующих ответов.

Например, в вашем примере контроллер может иметь следующее:

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');
    }
  },
};

Таким образом, у вас действительно простые контроллеры, и все бизнес-логики управляются службами.

Ответ 4

Это немного раздражает, когда вы просто пытаетесь создать что-то быстро, но в конечном итоге это создает хорошую практику организации кода (затрудняя работу всей бизнес-логики с контроллером).

Ответ 5

Я хотел бы предложить решение, которое работает, но не самый лучший способ сделать это. Мы можем использовать функцию привязки для привязки контекста к вызывающему источнику, как показано ниже:

generateUrl присутствует в контроллере A

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

Получить URL-адрес - это еще один метод в контроллере A

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

Надеюсь, это поможет!

Ответ 6

Более элегантный способ решить эту проблему - использовать ключевое слово this перед именем функции.

Пример:

one: function() {
   console.log('First Function');
},

two: function() {
   // call the function one in the same controller
   this.one();
}