我正在通过使用vanilla node.js编写webdev框架来开发我对服务器的理解。这是第一次出现这样一种情况,即服务器的json
响应中包含了一个法语字符,而且这个字符显示为一个无法识别的符号(铬合金中的一个问号)。
问题是编码,这是在这里指定的:
/*
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
问题在于服务器发送的所有内容都被编码为二进制文件,这会破坏显示某些字符的能力。修复似乎很简单;在binary
中包含一个布尔response
值,并相应地调整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
响应起作用,因为它们可以容忍不必要的空格,但我讨厌这个解决方案,它会破坏其他{ {1}}Š!
我的问题是:有人能让我对这个问题有所了解吗?
答案 0 :(得分:0)
如果您要明确设置Content-Length
,则应始终在正文上使用Buffer.byteLength()
来计算长度,因为该方法会返回实际的数字字符串中的字节数而不是字符的数量,如字符串.length
属性将返回。