Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express.js中res.send和res.json的区别_Javascript_Node.js_Http_Express - Fatal编程技术网

Javascript Express.js中res.send和res.json的区别

Javascript Express.js中res.send和res.json的区别,javascript,node.js,http,express,Javascript,Node.js,Http,Express,res.send和res.json之间的实际区别是什么,因为两者似乎都执行响应客户端的相同操作。当传递对象或数组时,方法是相同的,但是res.json()也将转换非对象,例如null和未定义的,它们不是有效的JSON 该方法还使用json替换程序和json空间应用程序设置,因此可以使用更多选项格式化json。这些选项设置如下: app.set('json spaces', 2); app.set('json replacer', replacer); 并传递给一个JSON.stringify(

res.send
res.json
之间的实际区别是什么,因为两者似乎都执行响应客户端的相同操作。

当传递对象或数组时,方法是相同的,但是
res.json()
也将转换非对象,例如
null
未定义的
,它们不是有效的JSON

该方法还使用
json替换程序
json空间
应用程序设置,因此可以使用更多选项格式化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
这是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);

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

  • 尊重
    json空间
    json替换程序
    应用程序设置
  • 确保响应具有utf8字符集和应用程序/json内容类型

查看发送的标题…
res.send使用内容类型:text/html
res.json使用内容类型:application/json


编辑:send实际上会根据给定的内容更改发送的内容,因此字符串以text/html的形式发送,但如果您向其传递一个对象,它将发出application/json。

res.json
将参数强制为json
res.send
将采用非json对象或非json数组并发送另一种类型。例如:

这将返回一个JSON编号

res.json(100)
这将返回一个状态代码,并发出使用sendStatus的警告

res.send(100)

如果您的参数不是JSON对象或数组(null、未定义、布尔、字符串),并且您希望确保它以JSON的形式发送,请使用
res.JSON

花点时间注意发布答案的人是如何进入github并阅读源代码的。这是一个学习和养成的好习惯。真相在于源头。@PeterLyons我同意这是一个好习惯,但你的意思是拉姆应该看源头而不是问问题吗?这不是违背了这个网站的目的吗?这个问题的存在,以及一个好的来源(来源!)的答案是很有用的。是的,教一个人钓鱼和其他。当我们被告知“RTFS”(阅读来源)时,实际上意味着文档无法传达他们应该传达的内容。是的,有了来源,我们就可以检查它,但除了在不清楚的情况下,我们不需要去查它。所有这些Express功能都非常棒,但文档却有很多不足之处。所以有很多关于表达的问题是人们从文档中无法理解的(发生在我身上)。有时阅读资料是不够的,因为答案可能会给出很好的解释,这将确保对所涉及的概念有最好的理解。有些人会简单地阅读源代码并理解它,但对于那些不一定对javascript友好的初学者呢?想一想,在这句话中:
将接受一个非json对象或数组
->我们读起来就像:
非json对象
数组
。所以,如果可能的话,请说得更清楚一些。