web-dev-qa-db-ja.com

sails.jsコントローラメソッドからコントローラメソッドにアクセスする

どうして他のコントローラメソッドから他のコントローラメソッドにアクセスできないのですか?

このような。

module.exports = 

   findStore: ->
       # do somthing

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

編集済み

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

あなたがこれを行うことができない場合は、なぜそうしないのですか?他にどのようにこれを行うべきですか...

15
iConnor

過去数時間同じ問題を抱えています。 api/servicesフォルダーを使用しました。それはあなたが正確に必要とするものではないかもしれませんが、それはオプションです。良い説明はこちらです。 sails.jsのapi/servicesフォルダーに追加するサービス

7
lloop

sails.controllers.yourControllerName.findStore()を使用できます

sailsグローバルオブジェクトには、ほとんどすべてへの参照があります。

64
nidheeshdas

少なくとも私と私のチームにとって、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');
    }
  },
};

このようにして、コントローラーは非常にシンプルになり、すべてのビジネスロジックはサービスによって管理されます。

24

何かをすばやく構築しようとするだけでは少し煩わしいですが、長期的には(すべてのビジネスロジックをコントローラーに投入するのが難しくなるため)良いコード編成の実践が強制されます。

2
Josh Liptzin

私は機能するが、それを行うための最良の方法ではない解決策を提案したいと思います。 bind関数を使用して、次のようにコンテキストを呼び出し元にバインドできます。

generateUrlがコントローラーAに存在する

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

uRLの取得は、コントローラーAの別のメソッドです

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

これが役に立てば幸いです!

1
monothorn

この問題を解決するよりエレガントな方法は、関数名の前にキーワードthisを使用することです。

例:

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

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

あなたはこのようなことをすることができます:

//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);
    ...
  }
};
0
Marcell