2016-10-07 3 views
0

私はバニラnode.jsを使ってwebdevフレームワークを書いてサーバの理解を深めています。はじめて、サーバーからの応答であるjsonにフランス語の文字が含まれている状況が発生し、この文字は認識できない記号(クロムのダイヤモンド内の疑問符)として表示されました。バニラnode.jsレスポンスエンコーディング - 奇妙な振る舞い(英雄)

/* 
At this stage we have access to "response", which is an object of the 
following format: 

response = { 
    data: 'A string which contains the data to send', 
    encoding: 'The encoding type of the data, e.g. "text/html", "text/json"' 
} 
*/ 

var encoding = response.encoding; 
var length = response.data.length; 
var data = response.data; 

res.writeHead(200, { 
    'Content-Type': encoding, 
    'Content-Length': length 
}); 
res.end(data, 'binary'); // Everything is encoded as binary 

問題は、サーバによって送信されるすべてがバイナリとして符号化されたことを、特定の文字を表示する能力を遺跡:

問題は、ここで指定されたエンコーディングでした。修正は単純なようでした。 responseにブールbinary値が含まれ、それに応じてres.endの第二パラメータを調整します。私はいくつかの非常に、非常に奇妙な行動を生み出してきたのはここ

/* 
At this stage we have access to "response", which is an object of the 
following format: 

response = { 
    data: 'A string which contains the data to send', 
    encoding: 'The encoding type of the data, e.g. "text/html", "text/json"', 
    binary: 'a boolean value determining the transfer encoding' 
} 
*/ 

. 
. 
. 

var binary = response.binary; 

. 
. 
.     

res.end(data, binary ? 'binary' : 'utf8'); // Encode responses appropriately 

です。この変更により、フランス語文字が正しく表示されますが、は、クライアント側で応答の最後の文字を省略することがあります。

このバグは、私がherokuでアプリケーションをホストすると発生します。ローカルでは、最後の文字は決して失われません。

最終的な}文字が欠落しているにもかかわらず、特定の応答(すべてではありません)がクライアント側のJSON.parseコールを壊すため、このバグに気付きました。

私はを働く、今恐ろしいバンドエイドソリューションを持っている:

var length = response.data.length + 1; 
var data = response.data + ' '; 

私は単にサーバーから送信されたすべての単一の応答にスペースを追加しています。これは実際には、すべてのtext/html,text/csstext/json、およびapplication/javascriptの応答が不必要な空白を許容できるので機能しますが、私はこの解決策が嫌い、他のものを破りますContent-Type秒!

私の質問です:誰も私にこの問題のいくつかの洞察力を与えることができますか?

答えて

0

明示的Content-Lengthを設定しようとしている場合、そのメソッドは文字列ではなく文字の数にバイトの実際数を返しますので、あなたは常に、長さを計算するために身体にBuffer.byteLength()を使用する必要があります文字列.lengthのように戻ります。

+0

これを試してみると、問題があるようです。好奇心から、明示的な「Content-Length」を設定していない*ことの意味は何ですか? –

+0

デフォルトでは、ノードは、 'Content-Length'が明示的に設定されていない場合、' Transfer-Encoding:chunked'を使用してチャンクレスポンスを返します。これは、データをストリームに戻し、長さがわからない場合に特に便利です。これは、バイト長がノードによって自動的に計算されるため、あなたの特定の原因にも役立ちます。 – mscdex

+0

冷たい、私は最終的に明示的な割り当てを廃止するかもしれません。その間、あなたのアドバイスは完璧に機能します!ありがとう:) –