2012-01-29 97 views
0

我很新的Node.js,所以請忍受我...Node.js - 回調之外的回調?

Bascially,我有一個代理服務器,我想攔截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 2012-01-29 20:24:08

+0

嗯。我不確定你是什麼意思。我需要找到文檔,看看它是否。 – Eamorr 2012-01-29 20:27:19

+0

看起來第二個參數是x,對於requester.send(chunk,x)必須是一個整數(標誌)。 – Eamorr 2012-01-29 20:37:04

回答

1

爲尖alread已經指出(我看到你在那裏做了什麼;)),你需要通過添加一個回調來使requester.send(chunk);異步,一旦你的C程序完成了它,它就會被調用。你也可以通過直接返回值來實現非異步( - >同步)。

我會在一些關於「如何用綁定創建自己的node.js模塊」的教程中挖掘;

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

嘿,謝謝你的消息。我的C程序沒有完成 - 它必須持續監視通過代理進行的操作。我想我可能不得不寫一個Node.js模塊,而不是這樣做;( – Eamorr 2012-01-29 22:24:00

+0

我會看示例演示eventEmitter的想法,因爲您將要觸發C程序中的「數據」事件到節點 – japrescott 2012-02-27 08:51:10