正确的方法来使用节点或Express返回JSON
所以,可以尝试获取以下JSON对象:
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue HTTP/1.1 200 OK Access-Control-Allow-Origin: * Content-Type: application/json; charset=ISO-8859-1 Date: Wed, 30 Oct 2013 22:19:10 GMT Server: Google Frontend Cache-Control: private Alternate-Protocol: 80:quic,80:quic Transfer-Encoding: chunked { "anotherKey": "anotherValue", "key": "value" } $
有没有一种方法可以在服务器使用节点或expression式的响应中产生完全相同的主体? 显然,可以设置标题,并指出响应的内容types将是“application / json”,但是有不同的方式来写/发送对象。 我见过的常用的是使用下面的命令:
response.write(JSON.stringify(anObject));
但是,有两点可以说是“问题”:
- 我们正在发送一个string。
- 而且,最后没有新的线路特征。
另一个想法是使用命令:
response.send(anObject);
这似乎是发送一个JSON对象基于curl的输出类似于上面的第一个例子。 但是,在terminal上再次使用curl时,在主体的末尾没有新的行字符。 那么,怎样才能真正写下类似这样的东西,最后使用node或node / express附加一个新的行字符呢?
这个响应也是一个string,如果你想发送响应美化,由于一些尴尬的原因,你可以使用像JSON.stringify(anObject, null, 3)
将Content-Type
头部设置为application/json
也很重要。
var http = require('http'); var app = http.createServer(function(req,res){ res.setHeader('Content-Type', 'application/json'); res.send(JSON.stringify({ a: 1 })); }); app.listen(3000); // > {"a":1}
美化:
var http = require('http'); var app = http.createServer(function(req,res){ res.setHeader('Content-Type', 'application/json'); res.send(JSON.stringify({ a: 1 }, null, 3)); }); app.listen(3000); // > { // > "a": 1 // > }
我不确定你为什么要用换行符来终止它,但是你可以用JSON.stringify(...) + '\n'
来实现。
performance
在expression中,您可以通过改变选项来做到这一点。
'json replacer'
replacercallback,默认情况下为null
'json spaces'
格式'json spaces'
JSON响应空间,在开发中默认为2,生产中为0
实际上并不build议设置为40
app.set('json spaces', 40);
那么你可以用一些json来回应。
res.json({ a: 1 });
它将使用'json spaces
'configuration来对其进行优化。
由于Express.js 3x的响应对象有一个json()方法,它为您正确设置所有标题,并以JSON格式返回响应。
例:
res.json({"foo": "bar"});
如果你想发送一个json文件,你可以使用stream
var usersFilePath = path.join(__dirname, 'users.min.json'); apiRouter.get('/users', function(req, res){ var readable = fs.createReadStream(usersFilePath); readable.pipe(res); });
您可以使用pipe道和许多处理器中的一种对其进行美化。 您的应用程序应始终以尽可能小的负载进行响应。
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print