Node.js - обратный вызов за пределами обратного вызова? - PullRequest
0 голосов
/ 30 января 2012

Я довольно новичок в 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);

Iнадеюсь, кто-то может помочь ...

1 Ответ

1 голос
/ 30 января 2012

, как указал Pointy alread (я вижу, что вы там делали;)), вам нужно сделать requester.send(chunk); асинхронным, добавив обратный вызов, который вызывается, как только ваша C-программа закончит делать то, что делает.Вы также можете сделать это не асинхронно (-> синхронно), напрямую возвращая значение.

Я бы покопался в некоторых уроках о том, «как создать свой собственный модуль node.js с привязками»;

  1. Хороший обзор
  2. Простой асинхронный модуль самого Исаака Шлейтерса
...