"意外的输入结束“;从简单POST请求到node.js的响应消息

"Unexpected end of input" message on response from simple POST request to node.js

本文关键字:请求 node js 响应 POST 消息 意外 quot 输入 结束 简单      更新时间:2023-09-26

我编写了一个简单的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的Advanced Rest Client对此进行POST时,我会返回一个200 OK的响应,但在响应内容的JSON选项卡中,会出现术语"意外输入结束",而不是解析后的JSON。

在原始选项卡中,显示字符串"{"foo":"bar’s answer",这清楚地说明了json无法解析的原因(它缺少结尾的"}")。

如果我从原始对象中删除",那么当返回时,响应解析得很好。

知道为什么一个简单的"会导致json无法解析吗?在测试中,我遇到了与其他各种角色相同的问题。

您需要将Content-Length设置为byteLength

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

因为它与String length:不同

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

这是因为,使用UTF-8编码(Node的默认值),只有当字符串完全由ASCII代码点(U+000-U+007F)组成,而该字符串包含U+2019,"右单引号"时,它们才会匹配。超过该范围,代码点会根据需要扩展到多个字节——在U+2019的情况下为3:

[ 0xE2, 0x80, 0x99 ]