2017-09-25 6 views
2

情報を取得してユーザーに送信するには、ノードサーバーが他のサーバーと接続する必要があります。このような状況では要求は非同期なので、通常はrequest-promiseなどの追加ライブラリを使用します。しかし、ここで私は多くのポイントから複数の呼び出しを持っているので、私はそれらを処理するための関数を作成しましたが、この解決法は機能しません。ノードjsは別の機能からの要求を約束します

apiCall1: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 
apiCall2: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 

function fetchFromOtherServer(){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
    if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     return body; 
    } 
    } 
} 

最初に、関数apiCall()を呼び出すと、fetchFromOtherServer関数が呼び出されます。しかし、要求が行われる前に、ノードは情報変数を未定義としてマークし、それをユーザに送信します。他のサーバーからの応答が得られるまでノードを待機させるようにコードを変更するにはどうすればよいですか?

答えて

0

あなたは自分の約束を必要とし、あなたは約束どおりハンドラを使いたいでしょう。 promise documention とその例を見てください。

apiCall1:

function(req,res){ var info_promise = fetchFromOtherServer(); 
    info_promise.then(function(info) { 
    console.log(info); // undefined 
    res.send(info) 
    }); 
    # Also look into catch on promises for error 
} 

function fetchFromOtherServer(){ 
    return new promise(function(resolve, fail){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
     if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     resolve(body); 
     } 
    } 
    }); 
} 
0

あなたがES6を使用している場合は、asyncawaitで行きます。コードを大幅に簡略化します。

apiCall1: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 
apiCall2: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 

async function fetchFromOtherServer(){ 
    let options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    let response = await request(options); 
    return response; 
} 
+0

今のところ、端末は「await」というフレーズでエラーを送信します。私のノードプロジェクトにES6を含めるにはどうしたらいいですか? package.jsonで何かしますか? – ampher911

+0

'babel'や' typescript'を使用していない場合、ネイティブ 'async'サポートのために' node 7.x'が必要です。 – nilobarp

関連する問題