使用nodejs http.request()在POST / PUT json上使用特殊字符时出现无效的JSON错误

时间:2016-12-22 18:38:14

标签: javascript json node.js couchdb

我正在使用node.js http模块将json数据输入CouchDB。这个json包含一个特殊字符“ä”,它导致CouchDB响应“invalid_json”错误。删除或替换此特殊字符后,将成功保存数据。我的node.js代码:

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 POST到CouchDB /_bulk_docs API时存在同样的问题。

1 个答案:

答案 0 :(得分:3)

问题是您要包含Content-Length的字符串长度,而不是字节长度 - 特殊字符的长度可以更长。尝试将行更改为:

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

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

Forum post discussing issue