Express.js中res.send()与res.json()的区别

2025 年 4 月 21 日 | 阅读 4 分钟

在应用程序开发过程中,将响应从 Express.js 应用程序发送到客户端是最常见的任务之一。在 Express 提供的响应传输方法中,有两个流行的选项:res.send()res.json()。乍一看,这两个函数似乎很相似,但它们的目标功能却各不相同,并且展现出不同的执行模式。在本文中,我们将讨论 Express.js 中 res.send() 和 res.json() 函数之间的区别。在讨论它们的区别之前,我们必须先了解 res.send() 和 res.json() 函数的示例和关键特性。

什么是 res.send()?

Express 通过通用的 res.send() 方法将响应传输到客户端。该函数支持来自不同格式的数据输入,范围从字符串和缓冲区到数组和对象。Express 会自动为我们通过 API 传输的每种数据类型定义 Content-Type 标头。

res.send() 的示例用法

res.send() 的关键特性

Express.js 中 res.send() 函数的几个关键特性如下:

  • 灵活性:它可以发送 字符串、缓冲区、数组和对象。
  • 自动 Content-Type:Express 会根据数据类型设置 Content-Type 标头。
    1. 对于字符串:text/html
    2. 对于对象:application/json
    3. 对于缓冲区:application/octet-stream
  • 简化的用法:它是一种通用的发送响应的方法。

什么是 res.json()?

res.json() 方法是 Express 中的一个专用方法,专门用于发送 JSON 响应。它使用 JSON.stringify() 将提供的数据转换为 JSON,并将 Content-Type 标头设置为 application/json。

res.json() 的示例用法

res.json() 的关键特性

res.json() 函数在 Express.js 中的几个关键特性如下:

  • JSON 特定:它针对发送 JSON 数据进行了优化。
  • 自动转换:它会自动将 JavaScript 对象或数组转换为 JSON。
  • Content-Type 标头:它始终将 Content-Type 标头设置为 application/json。

res.send() 和 res.json() 函数的主要区别

res.send()res.json() 函数之间存在几个主要区别。一些主要区别如下:

错误处理

  • send()
    将无效数据(包括循环对象引用)传递给 res.send() 会产生 Express 检测到的错误。例如:

除非在传输前验证数据,否则需要用户干预来解决此类错误。

  • json()
    当发送的 JSON 数据包含循环引用结构时,res.json() API 函数会生成错误。res.json() 的目标受众是 JSON 数据,这使其能够在序列化失败时显示精确的错误消息。

遵循与 res.send() 类似的错误处理要求,需要实现手动错误处理。

响应格式化

res.send()

  • res.send() 函数保留其原始数据输出,不做任何修改。数据将随合适的 Content-Type 标头信息一起传输,不做任何更改。
  • 当使用此函数时,对象的 JSON 序列化过程取决于 JSON.stringify() 的默认值。

res.json()

  • res.json() 精确地应用 JSON.stringify() 将数据转换为 JSON 格式。该函数保证所有响应都将格式化为 JSON。

对非标准数据类型的行为

res.send()

res.send() 函数提供了可用于非标准数据类型(包括自定义对象和类实例)的功能。操作产生的结果可能与我们预期的结果不符。

使用对象中的 toJSON() 方法允许 res.send() 序列化对象。

res.json()

res.json() 所调用的 JSON.stringify() 调用只包含对象中的可枚举属性。

如果指定的对象包含 toJSON() 方法,则 res.json() 函数会使用该方法来序列化对象。

处理数组

res.send()

使用 res.send() 时,Express 会将数组转换为 JSON 格式,并将 application/json 设置为标头。

res.json()

数组有意传输 JSON 数据需要 res.json()。但是,此方法会明确地向发送者和接收者发出其 JSON 意图。

处理缓冲区

res.send()

res.send() 方法允许使用 application/octet-stream 标头值传输缓冲区。

res.json()

res.json() 中的 JSON 接口不适用于缓冲区数据。当使用 res.json() 发送缓冲区时,它会尝试将它们转换为 JSON 格式,这可能会导致不期望的输出。

结论

总之,尽管响应的 sendjson 方法在初看时可能相似,但它们在操作和功能上有所不同。选择合适的方法取决于我们的具体需求,因为我们需要了解它们之间的区别。将 res.send() 函数用作默认响应方法,同时专门使用 res.json() 来传输 JSON 数据。结合使用这些特定方法将使我们能够创建性能更好且易于维护的 Express 应用程序。