potato
potato

Reputation: 46

Invalid JSON Error at POST/PUT json with special characters using nodejs http.request()

I'm using node.js http module to PUT a json data into CouchDB. This json contains a special character "ä" which causes CouchDB responding with "invalid_json" error. Once this special char is removed or replaced, the data is saved successfully. My node.js code:

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);

The interesting thing is, if I save this data into a json file and use curl command to PUT it into CouchDB, the data is saved without any problem.

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

Do I miss some encoding configurations at using nodejs http.request()? I tried with converting "Gerät" to 'utf8' encoding: Buffer.from("Gerät", "latin1").toString("utf8); but it didn't help.

The same issue exists with POSTing a json containing this special character to CouchDB /_bulk_docs API.

Upvotes: 2

Views: 1978

Answers (1)

Will P.
Will P.

Reputation: 8787

The issue is that you are including the string length for the Content-Length, but not the length in bytes -- special characters can have longer lengths. Try changing the line to this:

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

This should allow the content length to be correct.

Forum post discussing issue

Upvotes: 6

Related Questions