res.json() vs res.send() 的区别
在 Express.js 中,res.json()
和 res.send()
都是用于发送 HTTP 响应的方法,但它们有一些关键区别:
1. res.send([body])
- 自动推断 Content-Type:
- 如果传入
String
,则设置Content-Type: text/html
- 如果传入
Object
或Array
,则自动转为 JSON 并设置Content-Type: application/json
- 如果传入
Buffer
,则设置Content-Type: application/octet-stream
- 如果传入
- 适用场景:
- 适用于发送多种类型的数据(字符串、JSON、Buffer 等)
- 更通用,但需要 Express 自动推断 Content-Type
示例:
res.send("Hello World"); // Content-Type: text/html
res.send({ status: "OK" }); // Content-Type: application/json
res.send(Buffer.from("...")); // Content-Type: application/octet-stream
2. res.json([body])
- 强制设置
Content-Type: application/json
- 无论传入什么数据(对象、数组、字符串等),都会强制转为 JSON 并设置 JSON 的 Content-Type
- 如果传入非对象(如字符串),它仍然会尝试转为 JSON(如
"Hello"
→"Hello"
,仍然是合法的 JSON)
- 适用场景:
- 专门用于返回 JSON 数据,语义更明确
- 比
res.send()
更严格,确保返回的是 JSON
示例:
res.json({ status: "OK" }); // Content-Type: application/json
res.json("Hello"); // Content-Type: application/json(返回 "Hello" 字符串形式的 JSON)
res.json([1, 2, 3]); // Content-Type: application/json
关键区别总结
特性 | res.send() | res.json() |
---|---|---|
自动推断 Content-Type | ✔️(根据输入类型) | ❌(强制 application/json ) |
适用数据类型 | 字符串、JSON、Buffer 等 | 主要是 JSON(但可接受其他类型并强制转 JSON) |
语义明确性 | 通用,不明确 | 明确表示返回 JSON |
性能 | 稍快(直接发送) | 稍慢(强制 JSON 转换) |
推荐使用场景
-
用
res.json()
:- 当明确要返回 JSON 数据时(如 API 响应)
- 确保客户端始终收到正确的
Content-Type
-
用
res.send()
:- 当返回非 JSON 数据(如 HTML、纯文本或 Buffer)
- 需要更灵活的响应类型时
常用返回基本格式
res.status(200).json({ status: 'success', message: 'xxxxx', data: '{ xxx:xx }' });
结论
- 如果返回 JSON,优先用
res.json()
(语义更清晰)。 - 如果返回其他类型(如 HTML、文件),用
res.send()
。 - 两者在返回对象时几乎等效,但
res.json()
更明确。