在 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()更明确。