"意外的输入结束“;从简单POST请求到node.js的响应消息
"Unexpected end of input" message on response from simple POST request to node.js
我编写了一个简单的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 ]
相关文章:
- 在openshift node js应用程序中获取请求
- node.js请求数据事件未在CORS ajax调用中触发
- 关于在node.js中请求
- 在node-js路由中发出http请求
- Node.js https获取请求ECONNRESET
- Node JS-构造OAuth2请求
- 使用application/x-www-form-urlencoded使用node.js在post请求中发送数组
- Node.js HTTP/NET——连接和请求之间的区别
- 在node.js中从设备向服务器发送一个多部分请求
- 如何在node+express中重新运行请求处理程序
- 如何制作'http请求'在Node js中同步
- 使用node.js的HTTPS请求
- Node.js如何用一个线程处理同时请求
- 使用node.js发送并发ajax请求的限制是什么
- Node.js cors请求-异步示例不起作用
- 使用node.js和express来处理POST请求
- 防止 favicon.ico 发出第二个请求 - Node.js
- 检查在特定时间内是否没有请求Node.js
- 如何提取体请求node.js
- 修改请求.Node.Js / Express应用中的body和res.参数