2013-02-05 58 views
2

我寫了一個簡單的node.js程序來演示我遇到的問題。簡單的POST請求到node.js的響應「意外的輸入結束」消息

鑑於以下Node.js的程序:

var http = require('http'); 
http.createServer(function (req, res) { 
// simple repro for json deserializaiton error cause by right quote character '’' 
var json = { 'foo': 'bar’s answer' }; 
var write = JSON.stringify(json); 
res.writeHead(200, { 'Content-Type': 'application/json', 'Content-Length': write.length }); 
res.end(write); 
}).listen(8085, '127.0.0.1'); 

當我使用Chrome的高級REST客戶端張貼到這一點,我得到一個200 OK響應,但響應的內容的JSON選項卡中,出現了「意外的輸入結束」,而不是解析出的json。

在原始標籤,字符串「{」 foo「的:」顯示欄的回答」,使其成爲明顯的,爲什麼JSON無法解析(它缺少結束的‘}’)

如果。我從原始對象中刪除''',響應在返回時解析得很好。

任何想法爲什麼一個簡單'''導致json失敗解析?我遇到了同樣的問題在我測試中的各種其他字符。

回答

12

您需要將Content-Length設置爲byteLength而不是:

res.writeHead(200, { 
    'Content-Type': 'application/json', 
    'Content-Length': Buffer.byteLength(write) 
}); 

因爲它會從不同的Stringlength

console.log('bar’s answer'.length);    // 12 
console.log(Buffer.byteLength('bar’s answer')); // 14 

這是因爲,與UTF-8 encodingNode's default),他們只會如果字符串完全由ASCII code points(U + 0000匹配 - U + 007F),而該字符串包含U+2019,「single curved quote, right」。超出該範圍時,代碼點按需擴展爲多個字節 - 在U + 2019的情況下爲3:

[ 0xE2, 0x80, 0x99 ] 
+0

果然,這似乎解決了它。謝謝,先生,你既是學者又是紳士:) –