¡Acostúmbrate a escribir juntos! Este es el décimo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .
Descripción del requisito
Simule un middleware como express.urlencoded
este para analizar los datos del formulario enviados al servidor
Pasos de implementación
- Definir software intermedio
- Escuche el evento de datos de req
- Escuche el evento final de req
- Analizar los datos del cuerpo de la solicitud utilizando el módulo de cadena de consulta
- Monte el objeto de datos analizados como req.body
- Encapsule el middleware personalizado como módulos
Implementación
-
Definir software intermedio
const express = require('express') const app = express() // 定义解析表单数据的中间件 app.use((req, res, next) => { // 定义中间件具体的业务逻辑 }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-
Escuche el evento de datos de req
En el middleware, debe escuchar el evento de datos del objeto req para obtener los datos enviados por el cliente al servidor.
Si la cantidad de datos es relativamente grande y no se puede enviar a la vez, el cliente cortará los datos y los enviará al servidor por lotes. Por lo tanto, el evento de datos puede activarse muchas veces. Cada vez que se activa el evento de datos, los datos adquiridos son solo una parte de los datos completos, y los datos recibidos deben empalmarse manualmente.
const express = require('express') const app = express() // 定义解析表单数据的中间件 app.use((req, res, next) => { // 定义中间件具体的业务逻辑 //1、定义一个空字符串,用来存放客户端发送来的请求体数据 let str = '' //2、监听 req 的 data 事件 req.on('data', (chunk)=>{ str += chunk }) }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-
Escuche el evento final de req
Cuando se reciben los datos del cuerpo de la solicitud, los eventos req y end se activarán automáticamente. Por lo tanto, los datos completos del cuerpo de la solicitud se pueden obtener y procesar en el evento end de req.
const express = require('express') const app = express() // 定义解析表单数据的中间件 app.use((req, res, next) => { // 定义中间件具体的业务逻辑 //1、定义一个空字符串,用来存放客户端发送来的请求体数据 let str = '' //2、监听 req 的 data 事件 req.on('data', (chunk)=>{ str += chunk }) //3、监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的时完整的请求体数据 console.log(str) }) }) app.post('/user', (req, res) => { res.send('ok') }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-
Analizar los datos del cuerpo de la solicitud utilizando el módulo de cadena de consulta
Node.js tiene un módulo de cadena de consulta incorporado, que se usa especialmente para procesar cadenas de consulta. A través de las
parse()
funciones , puede analizar fácilmente la cadena de consulta en un formato de objeto.const express = require('express') //导入处理 querystring 的 node.js 内置模块 const qs = require('querystring') const app = express() // 定义解析表单数据的中间件 app.use((req, res, next) => { // 定义中间件具体的业务逻辑 //1、定义一个空字符串,用来存放客户端发送来的请求体数据 let str = '' //2、监听 req 的 data 事件 req.on('data', (chunk)=>{ str += chunk }) //3、监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的时完整的请求体数据 console.log(str) //4、把字符串格式的请求体数据,解析成对象格式 const body = qs.parse(str) console.log(body) }) }) app.post('/user', (req, res) => { res.send('ok') }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-
Monte el objeto de datos analizados como
req.body
A req y res se comparten entre el middleware ascendente y el middleware descendente y los enrutadores. Por lo tanto, los datos analizados se pueden montar como un atributo personalizado de req denominado req.body para uso posterior.
const express = require('express') //导入处理 querystring 的 node.js 内置模块 const qs = require('querystring') const app = express() // 定义解析表单数据的中间件 app.use((req, res, next) => { // 定义中间件具体的业务逻辑 //1、定义一个空字符串,用来存放客户端发送来的请求体数据 let str = '' //2、监听 req 的 data 事件 req.on('data', (chunk)=>{ str += chunk }) //3、监听 req 的 end 事件 req.on('end', () => { // 在 str 中存放的时完整的请求体数据 console.log(str) //4、把字符串格式的请求体数据,解析成对象格式 const body = qs.parse(str) console.log(body) //5、将解析出来的请求对象,挂载为 req.body req.body = body next() }) }) app.post('/user', (req, res) => { res.send('ok') }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-
Encapsule el middleware personalizado como módulos
Para optimizar la estructura del código, las funciones de middleware personalizadas se pueden encapsular en módulos independientes
-
Cree un módulo personalizado llamado custom-body-parser, extraiga las funciones de middleware previamente personalizadas y
module.exports
expórtelas//导入处理 querystring 的 node.js 内置模块 const qs = require('querystring') const bodyParser = (req, res, next) => { let str = '' req.on('data', (chunk)=>{ str += chunk }) req.on('end', () => { console.log(str) const body = qs.parse(str) console.log(body) req.body = body next() }) } module.exports = bodyParser 复制代码
-
llamada externa. Importe módulos personalizados y regístrese como middleware disponible globalmente
const express = require('express') const app = express() // 1、导入自己封装的中间件模块 const customBodyParse = require('./custom-body-parser') // 2、将自定义的中间件函数,注册为全局可用的中间件 app.use(customBodyParse) app.post('/user', (req, res) => { res.send(req.body) }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') }) 复制代码
-