之间有什么区别
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
答案 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