0

今日、node.js と zeromq バインディングをいじり始めたばかりですが、よくわからない動作が見られます。

同じマシンのポート 9000 で別の ruby​​ ベースの zeromq REP プロセスを呼び出すサンプル コードを次に示します。

var zeromq = require("zmq");
var http = require('http');

var counter = 0;

var availabilityResponse = function(counter, data, request, response) {
    var str = data.toString('utf-8');
    console.log(str);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write(str);
    response.end();                 
}

var zmqSocket = zeromq.createSocket('request');
zmqSocket.connect("tcp://127.0.0.1:9000");


var server = http.createServer()
server.on('request', function(request, response) {
    counter += 1;
    zmqSocket.send("Hola! - This is call # " + counter);
    zmqSocket.on('message', function(data) {
        availabilityResponse(counter, data, request, response);
    });

});
server.listen(8888);
console.log("Starting HTTP server on port 8888");

ブラウザを使用してノード サーバーにアクセスし、応答を待っています。奇妙なのは、コンソールに表示される出力が、理解していない追加的な方法で出くわしていることです。

Request received: Hola! - This is call # 1 - Now going to sleep for 1.0

Request received: Hola! - This is call # 2 - Now going to sleep for 3.0
Request received: Hola! - This is call # 2 - Now going to sleep for 3.0

Request received: Hola! - This is call # 3 - Now going to sleep for 3.0
Request received: Hola! - This is call # 3 - Now going to sleep for 3.0
Request received: Hola! - This is call # 3 - Now going to sleep for 3.0

Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0

zmqSocket.on() 呼び出しを http 要求ブロックの外に移動して、追加の動作を削除しようとしましたが、必要な要求/応答オブジェクトも含まれていません。

この演習のポイントは、応答がポート 9000 で長時間実行されている zeromq サーバー プロセスから返されるまでブラウザーを待機させることです (現在は偽造されたスリープ応答です)。

ここでコールバックを誤解しているだけだと確信していますが、このシナリオに関するドキュメントの方法で多くを見つけることができません。

助けてくれてありがとう。

4

2 に答える 2

5

着信リクエストが来るたびに zmqSocket.on('message', function(data) { イベントを再バインドしています。これにより、複数のイベントバインドが発生しています。そのコードブロックをリクエストハンドラの外に移動してください。

于 2011-08-18T21:03:26.210 に答える
0

Try:

server.on('request', function(request, response) {
    counter += 1;
    zmqSocket.send("Hola! - This is call # " + counter);
    zmqSocket.once('message', function(data) {
        availabilityResponse(counter, data, request, response);
    });

});

That way the function will only be bound for one message each time.

于 2011-08-19T17:40:45.370 に答える