2013-01-16 16 views
7

私の質問があまりにも素朴であれば、私はノードとノーブロッキングIOに関する非常に限られた知識しか持たないので、私を許してください。node.js応答を待つ

レスポンスボディに必要な情報を返すために、私は

  • に必要な応答
  • のためのサードパーティのAPIへの呼び出し
  • 待ちはいくつかの変更を追加し、情報IでJSONレスポンスを返してくださいAPIから得た

私の質問はどうすれば返事を待つことができますか?それとも、APIからの応答を受け取ったときに限り、クライアントに情報を送信することが可能です(私の知る限り、接続は双方向でなければならず、HTTPを使用できません)。

さらに別の質問です。 1つのリクエストがAPIからの応答を待っている場合、スレッド/プロセスの数を1からNに増やすまで、他のユーザーよりもこの平均は(ノードがシングルスレッドなので)待たされるでしょうか?

答えて

8

サービスを呼び出す関数にコールバックを渡します。サービスは、例えば、データベースの場合:

コードで
db.connect(host, callback); 

そして、どこか別の場所:

var callback = function(err, dbObject) { 
    // The connection was made, it's safe to handle the code here 
    console.log(dbObject.status); 
    res.json(jsonObject, 200) 
}; 

それとも、そう、無名関数を使用することができます呼び出し間

db.connect(host, function(err, dbObject) { 
    // The connection was made, it's safe to handle the code here 
    console.log(dbObject.status); 
    res.json(jsonObject, 200) 
}); 

をコールバック、ノードは自由に他のクライアント/コネクションを扱います。

6

このタイプの状況は、解決するために設計されたノードです。クライアントから要求を受け取ったら、http要求を行うことができます。この要求には、コールバックパラメータが必要です。これにより、要求が完了したときにコールバック関数が呼び出されますが、応答を待っている間にノードは他のクライアントにサービスを提供するなど、他の作業を実行できます。要求が完了すると、コードは依然として待機しているクライアントに応答を返すことができます。

ノードプロセスによって使用されるメモリとCPUの量は、追加のクライアントが接続するにつれて増加しますが、多くの同時クライアントを処理するために必要なプロセスは1つだけです。

ノードは、I/Oが非同期で実行されることに重点を置いているため、アプリケーションコードはタスクを開始し、I/Oが完了した後でコードを再実行することができます。

4

典型的な例は明らかにするかもしれません。 FB APIを呼び出します。レスポンスを受け取ったら、それを修正してJSONをユーザーに送信します。

var express = require('express'); 
var fb = require('facebook-js'); 

app.get('/user', function(req, res){ 
    fb.apiCall('GET', '/me/', {access_token: access_token}, function(error, response, body){ // access FB API 
    // when FB responds this part of the code will execute 
     if (error){ 
      throw new Error('Error getting user information'); 
     } 
     body.platform = 'Facebook' // modify the Facebook response, available as JSON in body 
     res.json(body); // send the response to client 
    }); 
});