在Express.js中,res.send和res.json有什么区别?

270

res.sendres.json之间的实际区别是什么?它们似乎执行相同的响应客户端操作。


92
请注意回答问题的人如何前往Github并阅读源代码。这是一个需要学习和建立的好习惯。真相掌握于源代码之中。 - Peter Lyons
39
@PeterLyons 我同意这是一种好习惯,但你的意思是 Ram 应该查看源代码而不是提问吗?这不是违背了这个网站的宗旨吗?有了这个问题,并且有关于一个好的来源(The Source!)的答案是很有用的。 - LinusR
5
是的,教一个人钓鱼,他就能自食其力。 - Peter Lyons
87
当我们被告知“RTFS”(阅读源代码)时,实际上意味着文档未能传达应该传达的内容。 是的,拥有源代码可以让我们进行检查,但除非在罕见情况下,否则不需要查看源代码。 所有这些 Express 的功能都非常棒,但是文档远远不够详细。Stack Overflow 上充满了关于 Express 的问题,人们无法从文档中理解(包括我自己)。 - Juan Lanus
4
仅仅阅读源代码并不足够,因为好的解释往往来自于回答,这将确保对所涉及概念的最佳理解。有些人可能会仅仅阅读源代码就能理解,但是对于那些不熟悉 JavaScript 的初学者呢?请深思熟虑。 - cram2208
显示剩余4条评论
4个回答

263
当传递一个对象或数组时,这两种方法是相同的。但是,res.json() 还会转换非对象(例如 nullundefined),这些不是有效的 JSON。此方法还使用了 json replacerjson spaces 应用设置,因此您可以使用更多选项格式化 JSON。这些选项设置如下:
app.set('json spaces', 2);
app.set('json replacer', replacer);

然后传递给JSON.stringify(),如下所示:

JSON.stringify(value, replacer, spacing);
// value: object to format
// replacer: rules for transforming properties encountered during stringifying
// spacing: the number of spaces for indentation

这是在 res.send() 方法中没有的 res.json() 方法的代码:

var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(obj, replacer, spaces);

该方法最终以 res.send() 结束。
this.charset = this.charset || 'utf-8';
this.get('Content-Type') || this.set('Content-Type', 'application/json');

return this.send(body);

92

参见: expressjs 上的res.json源代码

res.json 最终会调用res.send,但在此之前:

  • 尊重应用程序设置中的json spacesjson replacer
  • 确保响应具有utf-8字符集和application/json内容类型

24

查看发送的头信息...

res.send 方法使用 content-type:text/html

res.json 方法使用 content-type:application/json

编辑:实际上,send 方法会根据传入的内容进行更改发送的格式。如果传入的是字符串,则会使用text/html格式发送;但如果传递一个对象,则会使用application/json格式。


2

res.json将参数强制转换为JSON格式。res.send将接受非JSON对象或非JSON数组并发送其他类型的数据。例如:

这将返回一个JSON数字。

res.json(100)

这将返回一个状态码并发出警告,提示使用 sendStatus
res.send(100)

如果你的参数不是JSON对象或数组(nullundefinedbooleanstring),并且你想确保它以JSON格式发送,可以使用res.json

在这个句子中:“will take an non-json object or array” -> 我们可以理解为:非JSON对象或者数组。所以请尽可能让它更清晰明了。 - yaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接