8

私はノードとノブブロッキングIOについて非常に限られた知識しか持っていないので、私の質問があまりにも素朴な場合は許してください。

応答本文で必要な情報を返すために、私はする必要があります

  • サードパーティのAPIを呼び出す
  • 応答を待つ
  • いくつかの変更を追加し、APIから取得した情報を含むJSON応答を返します。

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

そしてさらに別の質問。1つのリクエストがAPIからの応答を待機する場合、これは、スレッド/プロセスの数を1からNに増やすまで、他のユーザーも(ノードがシングルスレッドであるため)待機することを余儀なくされることを意味しますか?

4

3 に答える 3

10

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

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)
});

呼び出しとコールバックの間で、ノードは他のクライアント/接続を「ノンブロッキング」で自由に処理します。

于 2013-01-16T14:40:29.933 に答える
6

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

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

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

于 2013-01-16T14:38:58.223 に答える
5

典型的な例はそれを明らかにするかもしれません。FBAPIを呼び出します。応答を受け取ったら、それを変更してから、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
    });
});
于 2013-01-16T16:36:01.087 に答える