паруса.метод контроллера доступа js из метода контроллера
Почему в sails вы не можете получить доступ к другим методам контроллера из другого?
Вот так.
module.exports =
findStore: ->
# do somthing
index: ->
@findStore(); # Error: undefined
Составлено
module.exports = {
findStore: function() {},
index: function() {
return this.findStore(); // Error: undefined
}
};
Если вы не можете этого сделать, то почему бы и нет? а как еще я должен это делать?..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 }
Надеюсь, это поможет!