我有以下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/