2016-12-22 23 views
0

我使用node.js http模块将一个JSON数据放入CouchDB。这个json包含一个特殊字符“ä”,导致CouchDB响应“invalid_json”错误。一旦这个特殊的字符被删除或替换,数据被成功保存。我的Node.js代码:无效的JSON错误POST/PUT JSON使用nodejs特殊字符http.request()

var data = { 
    "a": "Gerät" 
}; 

var stringifiedData = JSON.stringify(data); 

var http = http || require("http"); 

var requestOptions = { 
    "host": "localhost", 
    "port": "5984", 
    "method": "PUT", 
    "headers": { 
     "Content-Type": "application/json", 
     "Content-Length": stringifiedData.length 
    }, 
    "path": "/testdb/test" 
}; 

var req = http.request(requestOptions, function (res) { 
    res.setEncoding("utf8"); 
    res.on("data", function (chunk) { 
     console.log("Response: " + chunk); 
    }); 
}); 

console.log("stringifiedData: ", stringifiedData); 

req.end(stringifiedData); 

有趣的是,如果我保存这个数据成JSON文件,并使用curl命令把它放进CouchDB中,数据被保存没有任何问题。

curl -X PUT -d @test.json http://localhost:5984/testdb/test 

我在使用nodejs http.request()时会错过一些编码配置吗?我尝试将“Gerät”转换为“utf8”编码:Buffer.from("Gerät", "latin1").toString("utf8);但它没有帮助。

将包含此特殊字符的json发布到CouchDB /_bulk_docs API中也存在同样的问题。

回答

1

问题是,您包含Content-Length的字符串长度,但不包括字节长度 - 特殊字符可以有更长的长度。尝试更改此行:

var stringifiedData = new Buffer(JSON.stringify(data)); 

这应该允许内容长度是正确的。

Forum post discussing issue

+0

使用encodeURIComponent方法()结束保存'%C3%A4t'的GER代替'到的CouchDBGerät'。 – potato

+0

在这种情况下,服务器端可能需要对其进行解码(许多服务器端会自动进行解码),但大多数服务器端语言都有类似于javascript的[decodeURIComponent](https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/decodeURIComponent) –

+0

感谢您的快速响应,Will。该node.js脚本已经坐在服务器端,并且PUT请求直接发送到CouchDB url API。除此之外没有进一步的处理。 – potato