这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
Express 路由处理程序和中间件函数的第一个参数是 Express request 对象。此参数通常称为req
。
const express = require('express')
const app = express()
app.get('*', (req, res) => {
// req 是 Node.js 内置 HTTP 请求类的一个实例,具有 Express 中的一些附加功能
req instanceof require('http').IncomingMessage // true
res.json({ ok: 1 })
})
await app.listen(5000)
请求参数
默认情况下,Express 解析查询字符串参数,并将它们放入 req.query
属性中。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
const name = req.query.name // 'O.O'
const age = req.query.age // 18
res.json({ name, age })
})
await app.listen(3000)
// 在查询字符串中使用 URL 编码的参数向服务器发送 GET 请求
const querystring = 'name=O.O&age=18'
const res = await axios.get('http://localhost:5000?' + querystring)
console.log(res.data.name) // 'O.O'
console.log(res.data.age) // '18'
Express 还支持命名路由参数,并将其放入 req.params
对象中。命名路由参数始终是字符串,Express 使用 decodeUriComponent()
自动对其进行解码。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('/:model/:id', (req, res) => {
const model = req.params.model // 'user'
const id = req.params.id // '1'
res.json({ model, id })
})
const server = await app.listen(5000)
// 使用 URL 参数向服务器发送 GET 请求
const res = await axios.get('http://localhost:5000/user/1')
console.log(res.data.model) // 'user'
console.log(res.data.id) // '1'
默认情况下,Express 不会为您解析请求体。要选择解析 JSON 请求体,请使用 express.json()
中间件。然后,Express 将解析 HTTP 请求体,并将解析后的主体放入 req.body
中。
const axios = require('axios')
const express = require('express')
const app = express()
// 将请求体解析为 JSON。要求 Express >= 4.16.0。
app.use(express.json())
app.put('*', (req, res) => {
const name = req.body.name // 'O.O'
const age = req.body.age // 18
res.json({ name, age })
})
await app.listen(5000)
// 使用请求体向服务器发送 PUT 请求
const body = { name: 'O.O', age: 18 }
const res = await axios.put('http://localhost:5000', body)
console.log(res.data.name) // 'O.O'
console.log(res.data.age) // 18
Headers
要获取 HTTP 请求头的值,应该使用 Express req.get()
方法。您还可以使用 Node.js 原生 req.headers
属性。
const axios = require('axios')
const express = require('express')
const app = express()
app.get('*', function(req, res) {
// req.get() 不区分大小写。
const authorization = req.get('authorization')
// 或者您可以使用 req.headers
console.log(req.headers.authorization)
res.json({ authorization })
})
const server = await app.listen(5000)
// 使用 'Authorization' 头向服务器发送 GET 请求
const res = await axios.get('http://localhost:5000', {
headers: {
'Authorization': 'test'
}
})
console.log(res.data.authorization) // 'test'
请求体限制
默认情况下,express.json()
将请求体限制为 100kb。如果请求体更大,Express 将抛出 HTTP 413 "Payload Too Large" 错误。您可以使用 express.json()
的 limit
选项配置此限制。
const axios = require('axios')
const express = require('express')
const app = express()
// 将正文大小限制设置为 10 字节
app.use(express.json({ limit: 1 }))
app.put('*', (req, res) => {
const name = req.body.name // 'O.O'
const age= req.body.age// 18
res.json({ name, age })
})
await app.listen(5000)
// 使用请求正文向服务器发送 PUT 请求
const body = { name: 'O.O', age: 18 }
const err = await axios.put('http://localhost:5000', body)
.catch(err => err)
console.log(err.response.status) // 413