在 Web 服务开发中,服务器需要根据不同的业务需求,将各种类型的数据返回给客户端。Express 框架为开发者提供了丰富且易用的响应方法,让你可以灵活地设置响应内容、响应头、状态码等。下面从底层原理到常用方法,带你全面了解 Express 响应的核心用法。
1. 最底层的响应方式:res.end()
Express 的响应对象 res
实际上是 Node.js 原生 http.ServerResponse
的增强版。最底层的响应方法是 res.end()
,它直接结束响应流并返回数据。默认情况下,响应头 Content-Type
是 text/plain
,表示返回的是纯文本内容。
app.use((req, res) => {
// res.end() 可用于返回任意字符串或 Buffer
// 不会自动设置 Content-Type,需要开发者自行处理
res.end('Hello World')
})
这种方式简单直接,适合返回纯文本内容,但如果需要返回 JSON 或设置其他响应头,建议使用更高级的方法。
2. 返回 JSON 数据:res.json()
前后端分离开发中,后端接口最常见的响应格式就是 JSON。Express 提供了 res.json()
方法,专门用于返回 JSON 格式的数据。它有如下优点:
- 参数可以是对象、数组等任意可序列化的数据
- 会自动将对象序列化为 JSON 字符串
- 自动设置响应头
Content-Type: application/json
示例:
app.use((req, res) => {
res.json({
name: 'Klaus',
age: 23
})
})
这样前端拿到的数据就是标准的 JSON 格式,极大方便了数据交互。
3. 智能响应:res.send()
res.send()
是 Express 最常用、最灵活的响应方法。它可以根据传入的数据类型,自动设置合适的 Content-Type,并将数据返回给客户端。具体规则如下:
- 传入字符串 ⇒
Content-Type: text/html
- 传入 Buffer(二进制数据) ⇒
Content-Type: application/octet-stream
- 传入对象或数组 ⇒
Content-Type: application/json
(自动序列化为 JSON 字符串)
例如,返回二进制数据:
app.use((req, res) => {
const buf = Buffer.from('Hello World')
res.send(buf)
})
开发中,res.send()
适合快速返回字符串、HTML、JSON、Buffer 等各种类型的数据。
4. 设置响应状态码:res.status()
有时候需要主动设置响应码,比如 404(未找到)、500(服务器错误)、201(创建成功)等。Express 提供了 res.status()
方法,链式调用非常方便:
app.use((req, res) => {
// 设置响应码为 333(非标准码,仅作演示)
// 合理的做法应使用标准 HTTP 状态码
res.status(333).send('end')
})
- 若设置的状态码是标准 HTTP 状态码,则响应头会自动带上对应的描述文本(如 404 Not Found)。
- 若设置为非标准码,描述会显示为 UNKNOWN,但浏览器和客户端依然能识别到响应码本身。
res.status()
仅设置状态码,不会自动结束响应。需配合send()
,json()
,end()
等方法一起使用。