Express.js中res.send和res.json之间的区别


200

之间有什么实际差值res.send,并res.json为双方似乎响应客户端的执行相同的操作。


73
花一点时间来说明发布答案的人们是如何访问github并阅读源代码的。这是学习和建立的好习惯。真理在于源头。
彼得·里昂斯

31
@PeterLyons我同意这是一个好习惯,但是您的意思是说ram应该查看来源而不是问问题吗?这不会破坏本网站的目的吗?这个问题的存在以及答案都指向一个好的来源(该来源!),这很有用。
LinusR 2014年

3
是的,教一个人钓鱼。
Peter Lyons

71
当我们被告知“ RTFS”(阅读源代码)时,实际上意味着文档无法传达其应有的信息。是的,拥有源可以使我们对其进行检查,但是除非情况不明显,否则无需接触它。所有这些Express功能确实很棒,但是文档却远远不够。SO充满了人们无法从文档中理解的有关Express的问题(对我而言)。
Juan Lanus 2014年

3
有时阅读资料不足,并且由于答案可能引起很好的解释,这将确保对所涉及概念的最佳理解。有些人只是简单地阅读源代码并理解,但是对于那些不一定对JavaScript友好的初学者呢?想一想。
cram2208

Answers:


210

传递对象或数组时,方法是相同的,但是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.json()send方法没有的方法中的代码:

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

该方法最终以a res.send()结尾:

this.charset = this.charset || 'utf-8';
this.get('Content-Type') || this.set('Content-Type', 'application/json');

return this.send(body);


16

查看发送的标题...
res.send使用content-type:text / html
res.json使用content-type:application / json


0

res.json强制参数为JSON。 res.send将采用非json对象或数组,并发送其他类型。例如:

这将返回一个JSON数字。

res.json(100)

这将返回状态码并发出警告以使用sendStatus。

res.send(100)

如果您的参数不是JSON对象或数组(空,未定义,布尔值,字符串),并且您想确保将其作为JSON发送,请使用res.json

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.