Express 中的 request 参数

3,175 阅读2分钟

这是我参与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