паруса.метод контроллера доступа js из метода контроллера


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

Вот так.

module.exports = 

   findStore: ->
       # do somthing

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

Составлено

module.exports = {
  findStore: function() {},
  index: function() {
    return this.findStore(); // Error: undefined
  }
};
Если вы не можете этого сделать, то почему бы и нет? а как еще я должен это делать?..
6 15

6 ответов:

Имея ту же проблему в течение последних нескольких часов. Я использовал папку api/services. Это может быть не совсем то, что вам нужно, но это вариант. Здесь есть хорошее объяснение. какие сервисы можно добавить в папку api/services в sails.js

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

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

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

Также хорошей практикой является работа с обещаниями в сервисах (так как паруса используют их на модельных методах)

Просто создайте службу магазина (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');
    }
  },
};
Таким образом, у вас есть действительно простые контроллеры, и вся бизнес-логика управляется службами.

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

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

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

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

Get URL-это еще один метод в контроллере A

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

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

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

Пример:

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

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