我有以下node.js代码(拦截代理):

var http = require('http');
var eamorr=require('./Eamorr_addon/out/Release/Eamorr_addon');


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){
        var arr=eamorr.analyse(chunk);
        for(var i=0;i<arr.length;i++){
            //console.log(arr[i]+"\n\n");
            response.write(arr[i]);
        }
        response.write("2");   //this doesn't get written!
    });
    proxy_response.addListener('end',function(){
      response.end();
    });
    response.writeHead(proxy_response.statusCode,proxy_response.headers);
  });
  request.addListener('data',function(chunk){
    proxy_request.write(chunk,'binary');
  });
  request.addListener('end',function(){
    proxy_request.end();
  });
}).listen(10002);


如您所见,我有一个带有函数analyse()的自定义Node.js插件,该插件返回字符串数组。然后,我遍历此数组并写入结果。

我遇到的问题是“ 2”没有写好!

我真的被困在这里,想知道是否有人可以提供帮助?

现在我知道(根据Node.js文档)“第一次调用response.write(),它将把缓冲的头信息和第一个主体发送给客户端。第二次response.write()是所谓的Node假设您将要流式传输数据,并将其分开发送。也就是说,响应被缓冲到主体的第一块。”

我试过在response.end()之后插入response.write("2"),但仍然无法正常工作。

如何刷新输出或关闭流?

最佳答案

您的分析功能是同步还是异步?如果它执行任何异步操作,则好像您在其中留下了空白,在该位置上,响应可能在分析调用之后写入最后一个数据块之前结束。看起来它可能是完全同步的,但是即使需要花一些时间来处理,在on数据侦听器与on末端侦听器触发之间仍然可能存在竞争条件。

如果事实确实如此,则可以:a)在处理和中继代理数据时添加某种简单的互斥锁,以防止响应过早终止;或b)只需将response.write(“ 2”)移到proxy_response结束侦听器中,就在response.end()行的紧前面,因此它总是在同一回调中发生,不能被抢占。

如果结构更改带来的限制不会妨碍您的整体应用程序设计,则b显然会容易得多。假设我已经正确地猜测出实际的问题是什么,我可能完全没有根据,但看起来确实有可能。

关于javascript - Node.js-response.write(…)不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9413605/

10-11 12:25
查看更多