res.json() vs res.send() 的区别

发布于:2025-06-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

在 Express.js 中,res.json()res.send() 都是用于发送 HTTP 响应的方法,但它们有一些关键区别:

1. res.send([body])

  • 自动推断 Content-Type
    • 如果传入 String,则设置 Content-Type: text/html
    • 如果传入 ObjectArray,则自动转为 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() 更明确。

网站公告

今日签到

点亮在社区的每一天
去签到