2012-01-29 18 views
0

私はNode.jsをかなり使い慣れているので、私に負担してください。Node.js - コールバック以外のコールバック?

私はプロキシサーバーを持っていて、HTTPボディパケットを傍受したいと思います。これらのパケットはzeromqを介してNode.js(Cプログラム)と応答(変更されたパケット)以外の別のプロセスに送信され、プロキシからの応答として書き戻されなければなりません。私は意味があると思う。私はここで

にこだわっているビットでコードをコメントしました

は私のjavascriptのコードです:

var http = require('http'); 
var util=require('util'); 
var net=require('net'); 
var context = require('zmq'); 

// socket to talk to server 
util.puts("Connecting to server..."); 
var requester=context.createSocket('req'); 

requester.on("message",function(reply) { 
     util.puts("Received reply"+reply.toString()); 

     //response.write(reply,'binary'); //how do I pick up the `response` variable inside the proxy callback and write with it?! 
}) 

requester.connect("ipc://myfd.ipc") 

process.on('SIGINT', function() { 
     requester.close() 
}) 




http.createServer(function(request, response) { 
     var proxy=http.createClient(80,request.headers['host']); 
     var proxy_request=proxy.request(request.method,request.url,request.headers); 

     proxy_request.addListener('response',function (proxy_response){ 
       proxy_response.addListener('data',function(chunk){ 
         //util.puts(chunk); 

         requester.send(chunk); //ok, my C program can read chunks 

         response.write(chunk,'binary'); //I don't want to do this - I want to write the response of `requester.send(chunk)` 
       }); 
       proxy_response.addListener('end',function(){ 
         //util.puts("end"); 
         response.end(); 
       }); 
       response.writeHead(proxy_response.statusCode,proxy_response.headers); 
     }); 


     request.addListener('close',function(){ 
       //util.puts("close"); 
     }); 
     request.addListener('data',function(chunk){ 
       //util.puts("data"); 
       proxy_request.write(chunk,'binary'); 
     }); 
     request.addListener('end',function(){ 
       //util.puts("end"); 
       proxy_request.end(); 
     }); 
}).listen(8080); 

私は誰かが役立つことを願って...

+0

'request.send()'渡されるコールバックパラメータを許可しませんか?もしそうなら、それはあなたがそれをする方法です。 – Pointy

+0

Hmmm。私はあなたが何を意味するか分からない。私はドキュメンテーションを見つけ、それがあるかどうかを調べる必要があります。 – Eamorr

+0

requester.send(chunk、x)の2番目のパラメータxは、整数(フラグ)でなければなりません。 – Eamorr

答えて

1

先のとがったalreadとして(私があなたが何をしたのか分かります))、コールバックを追加することによってrequester.send(chunk);を非同期にする必要があります。コールバックは、Cプログラムが何をしたらすぐに呼び出されます。また、値を直接返すことで、非同期( - >同期)にすることもできます。

「独自のnode.jsモジュールをバインディングで作成する方法」については、チュートリアルを参照してください。

  1. Good Overview
  2. Simple Async Module by Isaac Schleuters himself
+0

ねえ、メッセージをありがとう。私のCプログラムは終了しません。プロキシ経由で何が起こっているかを継続的に監視しなければなりません。このようにするのではなく、Node.jsモジュールを書く必要があるかもしれないと思っています;( – Eamorr

+0

Cプログラムの "data"イベントをトリガーしたいので、eventEmitterのアイデアを示すサンプルを見ていきます。ノードに – japrescott