这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
Express 可以很容易地为 POST 请求注册路由处理程序。下面是一个基本的 POST 请求处理程序。
const express = require('express')
const app = express()
app.post('/', (req, res) => {
res.end('Hello, World!')
})
app.listen(5000)
上面的代码在端口 5000 上启动了一个 Express 服务器,它处理对 / 端点的 POST 请求。然后,您可以使用 HTTP 客户端(如 Axios)向服务器发送请求
const data = await axios.post('http://localhost:5000/', {})
console.log(data) // 'Hello, World!'
JSON 请求体
POST 请求与 GET 请求不同,因为 POST 请求允许在 HTTP 请求体中发送数据。例如,下面的代码发送一个 HTTP POST 请求,请求体中有一个 JSON 对象:
const axios = require('axios')
const res = await axios.post('http://localhost:5000/', {
answer: 42
})
默认情况下,Express 不解析 HTTP 请求体,但它有一个内置中间件,用解析的请求体填充 req.body 属性。例如,app.use(express.json()) 是告诉 express 为您自动解析 json 请求体的方式。
const axios = require('axios')
const express = require('express')
const app = express()
// 解析此应用程序的 JSON 数据。确保在路由处理程序之前放置 app.use(express.json())
app.use(express.json())
app.post('*', (req, res) => {
console.log(req.body) // 包含解析 JSON 的 JavaScript 对象
res.json(req.body)
})
await app.listen(5000)
const res = await axios.post('http://localhost:5000/', {
answer: 42
})
console.log(res.data) // `{ answer: 42 }`
URL 编码的请求正文
Express 有一个官方支持的模块 body-parser,其中包括一个用于 URL 编码的请求体的解析器,如通过 HTML 表单提交的请求体。
const axios = require('axios')
const express = require('express')
const app = express()
app.use(require('body-parser').urlencoded({ extended: false }))
app.post('*', (req, res) => {
console.log(req.body) // { answer: 42 }
res.json(req.body)
})
await app.listen(5000)
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
const res = await axios.post('http://localhost:5000/', 'answer=42', { headers })
console.log(res.data) // { answer: 42 }
文件上传
POST 请求通常用于文件上载。Express 本身并不便于上传文件,但有几个 npm 模块可以为您处理文件上传。Formidable 是 Express 最流行的文件上载库。以下是您如何使用 Formidable 上载文件:
const app = require('express')()
const formidable = require('formidable')
const fs = require('fs')
app.post('/upload', (req, res) => {
const form = new formidable.IncomingForm()
// 解析 req 并上载所有相关文件
form.parse(req, (err, fields, files) => {
if (err != null) {
console.log(err)
return res.status(400).json({ message: err.message })
}
// files 对象包含已上载的所有文件。Formidable 将解析每个文件并为您上载到临时文件。
const [firstFileName] = Object.keys(files)
res.json({ filename: firstFileName })
})
})
await app.listen(5000)