En mi aplicación Express, quiero verificar la longitud del cuerpo y limitarla independientemente del tipo de contenido. Después de esto, quiero analizar el cuerpo si el tipo de contenido es json. ¿Cómo puedo conseguir esto? Por el momento, mi código es como el siguiente, pero el servidor se detiene en el middleware express.json():
const express = require('express') const contentType = require('content-type') const getRawBody = require('raw-body') const app = express() app.use(function(req, res, next) { const cType = req.headers['content-type'] || '' getRawBody(req, { length: req.headers['content-length'], limit: '1mb', encoding: contentType.parse(cType).parameters.charset }, function(err, string) { if(err) { next(err) } next() }) }) app.use(express.json())No puedes implementar las cosas de esa manera. express.json() espera leer el contenido del cuerpo del flujo entrante. Pero, raw-body ya ha leído el contenido del cuerpo de la secuencia, por lo que cuando express.json() intenta leerlo, se atasca esperando que haya algo para leer.
Dado que express.json() hace dos cosas, lee el cuerpo de la transmisión y luego lo analiza en JSON, debería ser fácil reemplazar esas dos cosas con su propia versión. El primero ya está hecho (leer el cuerpo), por lo que todo lo que tiene que hacer es llamar a JSON.parse() en el contenido del cuerpo sin procesar que ya leyó si (y solo si), el tipo de contenido es "application/json" . Elimina la llamada a express.json() :
app.use(function(req, res, next) { const cType = req.headers['content-type'] || '' getRawBody(req, { length: req.headers['content-length'], limit: '1mb', encoding: contentType.parse(cType).parameters.charset }, function(err, string) { if(err) { next(err) } else { if (req.get('Content-Type').toLowerCase() === "application/json") { try { // try parsing the body as JSON req.body = JSON.parse(req.body); next(); } catch(e) { console.log(e); next(e); } } else { // not JSON, will leave the raw body in req.body next(); } } }) })Tenga en cuenta que si su aplicación espera otros tipos de contenido (como datos de formulario), también tendrá que analizarlos manualmente, ya que el middleware express estándar para esos otros tipos tendrá el mismo problema.