私はバニラ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/css
、text/json
、およびapplication/javascript
の応答が不必要な空白を許容できるので機能しますが、私はこの解決策が嫌い、他のものを破りますContent-Type
秒!
私の質問です:誰も私にこの問題のいくつかの洞察力を与えることができますか?
これを試してみると、問題があるようです。好奇心から、明示的な「Content-Length」を設定していない*ことの意味は何ですか? –
デフォルトでは、ノードは、 'Content-Length'が明示的に設定されていない場合、' Transfer-Encoding:chunked'を使用してチャンクレスポンスを返します。これは、データをストリームに戻し、長さがわからない場合に特に便利です。これは、バイト長がノードによって自動的に計算されるため、あなたの特定の原因にも役立ちます。 – mscdex
冷たい、私は最終的に明示的な割り当てを廃止するかもしれません。その間、あなたのアドバイスは完璧に機能します!ありがとう:) –