Proper way to return JSON using node or Express Proper way to return JSON using node or Express express express

Proper way to return JSON using node or Express


That response is a string too, if you want to send the response prettified, for some awkward reason, you could use something like JSON.stringify(anObject, null, 3)

It's important that you set the Content-Type header to application/json, too.

var http = require('http');var app = http.createServer(function(req,res){    res.setHeader('Content-Type', 'application/json');    res.end(JSON.stringify({ a: 1 }));});app.listen(3000);// > {"a":1}

Prettified:

var http = require('http');var app = http.createServer(function(req,res){    res.setHeader('Content-Type', 'application/json');    res.end(JSON.stringify({ a: 1 }, null, 3));});app.listen(3000);// >  {// >     "a": 1// >  }

I'm not exactly sure why you want to terminate it with a newline, but you could just do JSON.stringify(...) + '\n' to achieve that.

Express

In express you can do this by changing the options instead.

'json replacer' JSON replacer callback, null by default

'json spaces' JSON response spaces for formatting, defaults to 2 in development, 0 in production

Not actually recommended to set to 40

app.set('json spaces', 40);

Then you could just respond with some json.

res.json({ a: 1 });

It'll use the 'json spaces' configuration to prettify it.


Since Express.js 3x the response object has a json() method which sets all the headers correctly for you and returns the response in JSON format.

Example:

res.json({"foo": "bar"});


If you are trying to send a json file you can use streams

var usersFilePath = path.join(__dirname, 'users.min.json');apiRouter.get('/users', function(req, res){    var readable = fs.createReadStream(usersFilePath);    readable.pipe(res);});