这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
Express 路由处理程序和中间件函数的第二个参数是 Express response 对象,通常称为 res。res 对象公开了几个方法,可让您配置和发送对 HTTP 请求的响应。
使用 res.send() 的基本响应
res.send() 方法是发送 HTTP 响应的最基本方式。使用字符串调用 res.send() 会发送一个响应,该响应将字符串作为响应体,Content-Type 设置为 'text/html; charset=utf-8'。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
res.send('Hello, World')
})
await app.listen(5000)
const res = await axios.get('http://localhost:5000')
console.log(res.data) // 'Hello, World'
console.log(res.headers['content-type']) // 'text/html; charset=utf-8'
使用 res.json() 的 JSON 响应
res.send() 方法在实践中很少使用,因为 Express response 有几个方便的辅助函数。如果您正在构建 RESTful API 或其他以 JSON 格式发送响应的后端服务,则应使用 res.json() 方法。res.json() 方法使用 JSON.stringify() 将给定对象转换为 JSON 并将 Content-Type 设置为'application/json; charset=utf-8'。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
res.json({ answer: 42 })
})
await app.listen(5000)
const res = await axios.get('http://localhost:5000')
console.log(res.data) // { answer: 42 }
console.log(res.headers['content-type']) // 'text/html; charset=utf-8'
渲染模板语言
Express 支持几种不同的流行模板语言。例如,您可以使用 Pug(以前称为 Jade)。
假设 views/test.pug 中有以下 Pug 代码:
h1=message
下面的 Express 路由处理程序将渲染一个 h1 包含 "Hello, World" 的标签。
const axios = require('axios')
const express = require('express')
const app = express()
// 将 pug 设置为视图引擎
app.set('view engine', 'pug')
app.get('*', function(req, res) {
// 加载 'views/test.pug',并使用给定的 'locals' 进行渲染
const locals = { message: 'Hello, World' }
res.render('test', locals)
})
await app.listen(5000)
const res = await axios.get('http://localhost:5000')
console.log(res.data) // '<h1>Hello, World</h1>'
设置响应状态
res.status() 方法可让您设置响应状态。与 res.send()、res.json() 和 res.render() 不同,res.status() 实际上并不发送响应。这就是为什么您通常会看到 res.status().json() 或 res.status().render()。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
// 将响应状态设置为 201 “已创建”。默认情况下,响应状态为 200 “确定”。
res.status(201).json({ ok: 1 })
})
await app.listen(5000)
const res = await axios.get('http://localhost:5000')
console.log(res.status) // 201
响应头
res.status() 方法允许您设置 HTTP 响应头。下面的示例演示了手动设置发送 SVG 图像的响应内容类型。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
// 设置 Content-Type 意味着 Chrome 会将此端点视为要下载的图像,而不是要显示的页面。
res.set('content-type', 'image/svg+xml').send(`
<svg width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="blue" stroke-width="4" fill="white" />
</svg>
`)
})
await app.listen(5000)
const res = await axios.get('http://localhost:5000')
console.log(res.headers['content-type']) // image/svg+xml; charset=utf-8
如果不发送响应会发生什么?
在 Express 中,你负责使用 res.json()、res.send()、res.end() 或 res.render() 发送响应。否则,请求将永远挂起。如果您不发送响应,Express 将不会抛出任何错误。
// Express 不会抛出错误,但对该端点的任何请求都将永久挂起,因为没有 res.send()
app.get('*', function(req, res) {
res.status(201)
})