用 querystring
模块解析请求体数据
-
Node.js
内置了一个querystring
模块,专门用来处理查询字符串。通过这个模块提供的parse()
-
代码码
// 导入 express 模块 const express = require('express') // 创建 express 的服务器实例 const app = express() // 4. 导入 Node 内置模块 querystring const qs = require('querystring') // 解析表单数据的中间件 app.use((req, res, next) => { // 定义中间价具体的业务逻辑 // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据 let str = '' // 2. 监听 req 的 data 事件 req.on('data', (chunk) => { str += chunk }) // 3. 监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的是完整的请求体数据 console.log(str) // 将字符串格式的请求体数据,解析成对象 // 5. 调用 qs.parse() 方法,将查询字符串解析成对象 const body = qs.parse(str) console.log(body) }) }) app.post('/user', (req, res) => { res.send('ok') }) // 调用 app.listen方法,指定端口号并启动 web 服务器 app.listen(3000, () => { console.log('running……') })
-
上游的中间件和下游的中间件及路由之间,共享同一份
req
和res
,因此,我们可以将解析出来的数据,挂载为req
的自定义属性,命名为req.body
案例代码
// 导入 express 模块 const express = require('express') // 创建 express 的服务器实例 const app = express() // 4. 导入 Node 内置模块 querystring const qs = require('querystring') // 解析表单数据的中间件 app.use((req, res, next) => { // 定义中间价具体的业务逻辑 // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据 let str = '' // 2. 监听 req 的 data 事件 req.on('data', (chunk) => { str += chunk }) // 3. 监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的是完整的请求体数据 console.log(str) // 将字符串格式的请求体数据,解析成对象 // 5. 调用 qs.parse() 方法,将查询字符串解析成对象 const body = qs.parse(str) // 6. 将解析出来的数据对象挂载为 req.body 属性 req.body = body next() }) }) app.post('/user', (req, res) => { res.send(req.body) }) // 调用 app.listen方法,指定端口号并启动 web 服务器 app.listen(3000, () => { console.log('running……') })
将自定义中间件封装为模块
-
为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块
-
代码如下:
-
// custom-body-parser.js const qs = require('querystring') const bodyParser = (req, res, next) => { // 定义中间价具体的业务逻辑 // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据 let str = '' // 2. 监听 req 的 data 事件 req.on('data', (chunk) => { str += chunk }) // 3. 监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的是完整的请求体数据 console.log(str) // 将字符串格式的请求体数据,解析成对象 // 5. 调用 qs.parse() 方法,将查询字符串解析成对象 const body = qs.parse(str) // 6. 将解析出来的数据对象挂载为 req.body 属性 req.body = body next() }) } module.exports = bodyParser
// 对自定义的中间件进行模块化拆分 // 导入 express 模块 const express = require('express') // 创建 express 的服务器实例 const app = express() // 1. 导入自己封装的中间件模块 const customBodyParser = require('./017-custom-body-parser') // 2. 将自定义的中间件函数,注册为全局可用的中间件 app.use(customBodyParser) app.post('/user', (req, res) => { res.send(req.body) }) // 调用 app.listen方法,指定端口号并启动 web 服务器 app.listen(3000, () => { console.log('running……') })