Vanilla node.js响应编码 - 奇怪的行为(heroku)

时间:2016-10-07 18:43:11

标签: node.js heroku encoding

我正在通过使用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/htmltext/csstext/jsonapplication/javascript响应起作用,因为它们可以容忍不必要的空格,但我讨厌这个解决方案,它会破坏其他{ {1}}Š!

我的问题是:有人能让我对这个问题有所了解吗?

1 个答案:

答案 0 :(得分:0)

如果您要明确设置Content-Length,则应始终在正文上使用Buffer.byteLength()来计算长度,因为该方法会返回实际的数字字符串中的字节数而不是字符的数量,如字符串.length属性将返回。