【问题标题】:Difference between res.send and res.json in Express.jsExpress.js 中 res.send 和 res.json 的区别
【发布时间】:2022-04-03 22:49:55
【问题描述】:

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

【问题讨论】:

  • 花点时间注意发布答案的人们是如何去 github 并阅读源代码的。这是一个学习和建立的好习惯。真理在于源头。
  • @PeterLyons 我同意这是一个好习惯,但你的意思是 ram 应该查看源而不是问问题吗?这不是违背了这个网站的目的吗?这个问题的存在,以及引用一个好的来源(The Source!)的答案是有用的。
  • 是的,教人钓鱼等等。
  • 当我们被告知“RTFS”(阅读源代码)时,这实际上意味着文档无法传达他们应该传达的信息。是的,拥有源代码可以让我们检查它,但除非在晦涩难懂的情况下,否则不需要找到它。所有这些 Express 功能都非常棒,但是文档差很多。 SO 充满了关于表达人们无法从文档中理解的事情的问题(发生在我身上)。
  • 有时阅读来源是不够的,因为可以从答案中得到很好的解释,这将确保对所涉及的概念有最好的理解。有些人会简单地阅读源代码并理解,但是对于不一定对 javascript 友好的初学者呢?想想吧。

标签: javascript node.js http express


【解决方案1】:

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

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);

【讨论】:

    【解决方案2】:

    请参阅:res.json source code on expressjs

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

    • 尊重json spacesjson replacer 应用设置
    • 确保响应包含utf-8 charset 和application/json Content-Type

    【讨论】:

      【解决方案3】:

      查看发送的标头...

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

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

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

      【讨论】:

        【解决方案4】:

        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 -> 我们这样读:non-json objectarray。所以如果可能的话,请说得更清楚。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 2013-03-14
        • 2020-09-26
        • 1970-01-01
        • 2017-11-25
        相关资源
        最近更新 更多