2016-08-26 5 views
0

私はActionHeroが新しく、キューに何かを追加し、それが完了するまで待ってからデータを取得してから、別のキュー項目を先に進める必要がありますクライアントに応答します。次のようになります。クライアントが当たるActionHero.jsでプログラムでアクションを呼び出す方法

  1. API/fooが
  2. FOOアクションバーのアクションを呼び出し、待機
  3. ...
  4. はバーが終了すると、それはそれから渡された123abc
  5. 123abcの値を返します。それを必要とするタスクのキューにもう一度書き込んでください。

ここでは、最適ではないことを理解していますが、これには3台のサーバーが必要です。/fooが私のNode ActionHeroサーバにヒットすると、123abcはJavaサーバ(認証サービスと考える)から来て、次にNode ActionHeroサーバがこれを送信して.NETサーバによって取得されます。 ACTIONで

私はタスクがヒットしないと、それはセットアップが現在のJavaサーバーとJavaサーバは、それが空のオブジェクト

実行(だ下回っ私はコードでが、を必要とする値をログアウト持っている方法) :

api.actions.enqueue('MyJavaServerTask', {...}, function(error, toRun){ 
    console.log(arguments) // <-- returns { '0': null, '1': true } 
    data.response.success = true 
    api.queue.push(data, next) 
}) 

はTASK:Javaサーバ上で

exports.task = { 
    name: 'MyJavaServerTask', 
    description: 'My Java Server Task', 
    frequency: 0, 
    queue: 'default', 
    run: function (api, params, next) { 
    var job = { 
     response: {}, 
     connection: {id: 'none'}, 
     authorization: params.authorization, 
     params: { 
     apiVersion: '1', 
     action: 'MyJavaServerTask', 
     ... 
     } 
    } 
    api.queue.push(job, function() { 
     console.log(arguments) // <-- returns {} 
     next() 
    }) 
    } 
} 

しかし、再び、私はやるリクエストを見ると成功し、正しいJSONが返されます。そのため、ログは

15:19:22.542 [run-main-0] INFO application - apiq read: {"id":"none","params":{"apiVersion":"1","action":"MyJavaServerTask"}} 
generating tables and key 
15:19:22.543 [run-main-0] INFO application - result: {"key":"..."} 

だから... ...どのように私は戻ってそこからkeyは、次のqueue'd項目に追加するために使用することですかのように見えますか?

+0

バックエンドサーバーをどのように呼び出すのか、何が起きるかについては明確ではありません。 'api.queue'はActionHeroのコアミドルウェアではありませんので、明らかにあなたが提供しているものです。 'api.actions.enqueue'も標準のAHメタファーではありません - あなたは' api.tasks'を意味しましたか?あなたのACTUALコードのGist/Plunkr/etcを提供できない限り、私たちがあなたを助けることは非常に困難です。 –

+0

したがって、 '/ foo'は通常、何らかの' bar() 'および' baz() '機能を順番に実行しなければならないHTTP(S)要求によって通常トリガされるAHアクションにあります。しかし、 'bar()'はまさに、どのように応答特性を操作するエンドポイントですか?そして、同様に、 'baz()'(.NETのステップ)も何ですか? – alphadogg

答えて

2

APIクライアントがJavaバックエンドからの応答がsynchronousであると予想される場合、アクション内から要求を呼び出すだけではどうですか。

exports.foo = { 
    name: 'foo', 
    description: 'foo', 
    outputExample: {}, 
    inputs: {} 

    run: function(api, data, next){ 
    var request = require('request); 
    request.get('bar.com/bar', function(error, response){ 
     if(error){ return next(error); } 
     var body = JSON.stringify(response.body); 
     data.response = body; 
     return next(); 
    }); 
    } 

}; 

ノードでは、アクションが待機している間にノードサーバーが他の要求を処理できるため、このパターンは優れています。

あなたのタスクの例が別のタスクをエンキューしているかどうかは分かりませんが、 api.queueとは何ですか?いずれにしても、タスクからアクションに値を戻す方法はありません。クライアントにPOLLを実行させたい場合は、Javaサーバーからの最終的な応答をredisまたは他の場所に格納し、キーが存在するかどうかを確認する別のアクションを作成し、存在する場合は戻します。

+0

JavaサーバーはRESTfulサーバーではないため、直接呼び出すことはできません。それはキューに入れられているRedisからのアクションを引き出します。私はそれを/ foo/barのように呼び出すことができましたが、それはちょっとした気分でした。 –

+0

これは私がやることですが、おそらく要求コードを初期化子にリファクタリングしています。このパターンを使用し始めると、バックエンドサーバーにもっと多くのリクエストを送る必要があります。その場合、アクションは 'request1' - >' request2' - > 'response'です。 –

関連する問題