提问者:小点点

使用node或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"
}
$

有没有方法使用node或Express在来自服务器的响应中产生完全相同的主体?显然,可以设置头并指示响应的内容类型为“application/json”,但是有不同的方法来编写/发送对象。我见过常用的一种方法是使用以下形式的命令:

response.write(JSON.stringify(anObject));

然而,这有两点可以作为“问题”加以争论:

  • 我们正在发送字符串。
  • 而且,最后没有新的行字符。

另一个想法是使用命令:

response.send(anObject);

这看起来是基于curl的输出发送一个JSON对象,类似于上面的第一个示例。但是,在终端上再次使用curl时,正文的末尾没有新的行字符。那么,怎样才能用node或node/express在末尾附加一个新的行字符来写下类似这样的东西呢?


共3个答案

匿名用户

该响应也是一个字符串,如果您想要发送经过美化的响应,则可以使用类似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.end(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.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);

// >  {
// >     "a": 1
// >  }

我不太清楚为什么要用换行结束它,但是您可以只执行json.stringify(。。。)+'\n'来实现。

在express中,您可以通过更改选项来实现这一点。

“JSON replacer”JSON replacer回调,默认情况下为null

'JSON spaces'JSON用于格式化的响应空间,在开发中默认值为2,在生产中默认值为0

实际上不建议设置为40

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

然后您可以用一些JSON进行响应。

res.json({ a: 1 });

它将使用'json spaces'配置来美化它。

匿名用户

由于Express.js3x,响应对象有一个json()方法,它为您正确设置所有头,并以json格式返回响应。

示例:

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

匿名用户

如果您试图发送一个json文件,您可以使用streams

var usersFilePath = path.join(__dirname, 'users.min.json');

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