res.send或res.json之间的区别

时间:2016-06-08 09:39:27

标签: node.js express

之间有什么区别
res.status(STATUS_CODE).send({"message" : "this is the message" });

res.status(STATUS_CODE).json({"message" : "this is the message" });

虽然检查了the similar question,但是在快递3的背景下,我正在寻找快递4

2 个答案:

答案 0 :(得分:11)

最终,两者都会达到同样的效果。如果您使用对象调用res.send,则会在res.send

中点击此切换
switch (typeof chunk) {
// string defaulting to html
case 'string':
  if (!this.get('Content-Type')) {
    this.type('html');
  }
  break;
case 'boolean':
case 'number':
case 'object':
  if (chunk === null) {
    chunk = '';
  } else if (Buffer.isBuffer(chunk)) {
    if (!this.get('Content-Type')) {
      this.type('bin');
    }
  } else {
    return this.json(chunk);
  }
  break;
}

如果您发送的对象不是缓冲区,则会调用res.json

res.json只需将Content-Type标头设置为application/json并通过JSON.stringify运行对象 - 并指定了替换器函数和spacer值。最终它会调用res.send

res.send的这个调用被发送一个字符串,case语句将中断,导致正在运行的函数的其余部分。 send函数的其余部分设置了诸如etag,内容大小等内容。您可以通过查看express code来了解更多信息。

当您向他们发送非对象响应时,例如字符串,数字等,它们会开始出现差异。在这种情况下,res.json将通过JSON.stringify运行它,但res.send不会:结果在不同的Content-Type标题和内容中。

编辑:要回答您对其他答案的评论,发送不同的状态代码仍然会表现相同。

答案 1 :(得分:3)

.json调用对象上的.toJSON()方法(如果存在),并将content-type标题设置为application/json

但如果您手动执行上述操作,基本上可以使用.json模拟.send

例如这个中间件

(req, res, next) => {
    let x = {};
    x.toJSON = () => {
        console.log('oh yeah');
        return 15;
    };

    return res.json(x);
}

打印

oh yeah

并使用这些标头向15返回请求(至少在我的简单快速应用中):

Connection →keep-alive
Content-Length →2
Content-Type →application/json; charset=utf-8
Date →Wed, 08 Jun 2016 10:16:09 GMT
ETag →W/"2-m/Mcf/Bik2qW08i9H48v8w"
Vary →Accept-Encoding
X-Powered-By →Express