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

pot*_*ato 2 javascript json couchdb node.js

我正在使用 node.js http 模块将 json 数据放入 CouchDB 中。此 json 包含特殊字符“\xc3\xa4”,这会导致 CouchDB 响应“invalid_json”错误。一旦删除或替换了这个特殊字符,数据就成功保存了。我的node.js代码:

\n\n
var data = {\n    "a": "Ger\xc3\xa4t"\n};\n\nvar stringifiedData = JSON.stringify(data);\n\nvar http = http || require("http");\n\nvar requestOptions = {\n    "host": "localhost",\n    "port": "5984",\n    "method": "PUT",\n    "headers": {\n        "Content-Type": "application/json",\n        "Content-Length": stringifiedData.length\n    },\n    "path": "/testdb/test"\n};\n\nvar req = http.request(requestOptions, function (res) {\n    res.setEncoding("utf8");\n    res.on("data", function (chunk) {\n      console.log("Response: " + chunk);\n    });\n});\n\nconsole.log("stringifiedData: ", stringifiedData);\n\nreq.end(stringifiedData);\n
Run Code Online (Sandbox Code Playgroud)\n\n

有趣的是,如果我将这些数据保存到 json 文件中并使用curl 命令将其放入 CouchDB,则数据保存不会出现任何问题。

\n\n
curl -X PUT -d @test.json http://localhost:5984/testdb/test\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

将包含此特殊字符的 json POST 到 CouchDB /_bulk_docsAPI 时也存在同样的问题。

\n

Wil*_* P. 5

问题是您包含了 的字符串长度Content-Length,但不包含以字节为单位的长度——特殊字符可以具有更长的长度。尝试将行更改为:

var stringifiedData = new Buffer(JSON.stringify(data));
Run Code Online (Sandbox Code Playgroud)

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

论坛帖子讨论问题