Ответ 1
У той же проблемы за последние несколько часов. Я использовал папку api/services. Возможно, это не совсем то, что вам нужно, но это вариант. Хорошее объяснение здесь. Какие услуги можно добавить в папку api/services в sails.js
Как в парусах вы не можете получить доступ к другим методам контроллера из другого?
как это.
module.exports =
findStore: ->
# do somthing
index: ->
@findStore(); # Error: undefined
Составитель
module.exports = {
findStore: function() {},
index: function() {
return this.findStore(); // Error: undefined
}
};
Если вы не можете этого сделать, тогда почему? как еще я должен это делать...
У той же проблемы за последние несколько часов. Я использовал папку api/services. Возможно, это не совсем то, что вам нужно, но это вариант. Хорошее объяснение здесь. Какие услуги можно добавить в папку api/services в sails.js
Вы можете использовать sails.controllers.yourControllerName.findStore()
Глобальный объект sails
имеет ссылки на почти все.
Один из лучших способов организовать ваш код в 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');
}
},
};
Таким образом, у вас действительно простые контроллеры, и все бизнес-логики управляются службами.
Это немного раздражает, когда вы просто пытаетесь создать что-то быстро, но в конечном итоге это создает хорошую практику организации кода (затрудняя работу всей бизнес-логики с контроллером).
Я хотел бы предложить решение, которое работает, но не самый лучший способ сделать это. Мы можем использовать функцию привязки для привязки контекста к вызывающему источнику, как показано ниже:
generateUrl присутствует в контроллере A
function generateUrl(){
return 'www.google.com';
}
Получить 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();
}