どうして他のコントローラメソッドから他のコントローラメソッドにアクセスできないのですか?
このような。
module.exports =
findStore: ->
# do somthing
index: ->
@findStore(); # Error: undefined
編集済み
module.exports = {
findStore: function() {},
index: function() {
return this.findStore(); // Error: undefined
}
};
あなたがこれを行うことができない場合は、なぜそうしないのですか?他にどのようにこれを行うべきですか...
過去数時間同じ問題を抱えています。 api/servicesフォルダーを使用しました。それはあなたが正確に必要とするものではないかもしれませんが、それはオプションです。良い説明はこちらです。 sails.jsのapi/servicesフォルダーに追加するサービス
sails.controllers.yourControllerName.findStore()
を使用できます
sails
グローバルオブジェクトには、ほとんどすべてへの参照があります。
少なくとも私と私のチームにとって、Sailsでコードを編成する最良の方法の1つは、サービス(/ api/services)にすべての実際のビジネスロジックを含めることでした。これらのオブジェクトには、任意のコントローラーからグローバルにアクセスできます。
また、サービスでプロミスを使用することをお勧めします(Sailはモデルメソッドでプロミスを使用するため)。
コードを使用して、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');
}
},
};
このようにして、コントローラーは非常にシンプルになり、すべてのビジネスロジックはサービスによって管理されます。
何かをすばやく構築しようとするだけでは少し煩わしいですが、長期的には(すべてのビジネスロジックをコントローラーに投入するのが難しくなるため)良いコード編成の実践が強制されます。
私は機能するが、それを行うための最良の方法ではない解決策を提案したいと思います。 bind関数を使用して、次のようにコンテキストを呼び出し元にバインドできます。
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();
}
あなたはこのようなことをすることができます:
//ArticleController
module.exports = {
findStore: async () => {
return await findStoreFunc(req.param('id'));
},
index: async () => {
...
return await findStoreFunc(id);
}
};
const findStoreFunc = async (id) => {...}
そして、別のコントローラーから関数を使用するには:
const ArticleController = require('./ArticleController');
//CustomerController
module.exports = {
index: async () => {
...
let article = await ArticleController.findStore(id);
...
}
};