2012-02-23 2 views
0

を働いていないのResponse.Write(...)は、私は次のNode.jsのコード(傍受プロキシ)している:あなたが見ることができるように、私は、カスタムのNode.jsをの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); 

を持っていますaddonには文字列の配列を返す関数analyse()が付いています。私はこの配列をループして結果を書いています。

私が抱えている問題は、「2」が書かれていないことです。

私は本当にここにこだわっていて、誰かが助けることができるかどうか疑問に思っていましたか?

Node.jsドキュメントによれば、「初めてresponse.write()が呼び出されると、バッファリングされたヘッダー情報と最初の本文がクライアントに送信されます。 write()が呼び出されると、Nodeはあなたがデータをストリーミングすると仮定し、それを別々に送信します。つまり、応答はボディの最初のチャンクまでバッファされます。

response.write("2")の後にresponse.end()に貼り付けを試みましたが、それでも機能しません。

出力をフラッシュする方法、またはストリーミングをオフにする方法はありますか?

+1

for-loopは、配列要素を応答に書き込むことはどうですか?それは、例えば大きな配列で正しく動作しますか? – supertopi

+0

ねえ、ちょうど私の昼食から戻ってきた。それは小さな配列(私は小さい配列を返すだけです)で正しく動作します。 – Eamorr

+0

エンコーディング 'バイナリ'は使用しないでください。それが問題の原因であるかどうかは分かりません。 – loganfsmyth

答えて

2

分析機能は同期または非同期ですか?それが非同期であれば、そこにギャップが残っているように見えます。ここでは、分析コール後に最後のデータチャンクが書き込まれる前に応答が終了する可能性があります。それはおそらく完全に同期しているように見えますが、処理にしばらく時間がかかっても、オンデータリスナーとオンリスナー発火の競合状態が存在する可能性があります。

本当に起こっていることが判明した場合、a)プロキシデータの処理と中継中に単純なミューテックスを追加して、応答が途中で終了しないようにします。またはb)response.write( "2")をresponse.end()行の直前でproxy_responseエンドリスナーに移動すると、常に同じコールバックで発生し、プリエンプトできません。その構造の変更によって課せられた制限がアプリケーション全体の設計を妨げることがない限り、明らかにはるかに簡単です。そして、それは私が正しく実際の問題が何であるかを推測したと仮定して、私は完全に基盤から外れるかもしれませんが、それは可能です。

+0

あなたの詳細な返信に多くの感謝。私はあなたの提案を試してみましたb) - response.end()の直前にいくつかの "2"文字列を書く。彼らはWiresharkに登場しますが、相手のNode.jsプログラムでは受信されません。私は今mutexの提案を試みるつもりです。私はこれの底に到達するのに苦労しています。私の関数(analyze)は同期ですが、非同期ブロックの内部にあるので、プログラムに目立つハングはありません。 – Eamorr

0

私はこれと同様の問題を抱えていましたが、「コンテンツ長」ヘッダーが原因であることがわかりました。クライアントはレスポンスボディが特定の長さになることを期待しており、その長さを超えると超過をカットします。したがって、レスポンスボディに追加するが、クライアントに送信される「content-length」ヘッダーを調整しない場合は、表示されている結果が得られます。

私の場合、「content-length」ヘッダーを削除しただけで問題は解決しましたが、それはまだその意味を十分に理解していません。