El middleware para guardar datos de publicación sin procesar en el objeto de solicitud no será el “siguiente” y causará un tiempo de espera

Necesito obtener los datos de publicación sin procesar para un punto final específico en una aplicación nodo / express. Hago:

app.use('/paypal/ipn',function(req, res, next) { var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); next(); }); }); 

Lo que sucede es que obtengo la salida console.log en la consola y luego no sucede nada. Después de un minuto aproximadamente, veo que el servidor devuelve 200, probablemente un tiempo de espera. Es como el comando next () nunca se ejecuta, o se ejecuta y se estira.

Cuando comento todo y simplemente llamo a next ():

 app.use('/paypal/ipn',function(req, res, next) { /* var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); next(); }); */ next(); }); 

Todo funciona, se llama al punto final (por supuesto, la solicitud no contiene el rawBody).

Entonces, ¿parece que estoy haciendo algo mal de la forma en que búferé a RawBody? ¿Algo que hace que next () no funcione?

Llame a next () sin esperar a que “finalice”, para evitar que bodyParser y su código interfieran.

 app.use(function(req, res, next) { req.rawBody = ''; req.on('data', function(chunk) { req.rawBody += chunk; }); next(); }); app.use(express.bodyParser()); 

Felicitaciones a https://stackoverflow.com/a/21222540/1891397

Tuve un problema similar, compruebe este código (rawBody):

 /* for some very strange reason, while a IE8/IE9 use a XDomain for CORS requests, express.js bodyParser fail to parse */ app.use(function(req, res, next) { if(req.method !== 'POST') { next(); return; } var data = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; req.failSafeBody = queryParser(data); next(); }); }); //se above //app.use(express.bodyParser()); app.use(function(req, res, next){ if(req.method === 'POST' && (!req.body || Object.keys(req.body).length<1) ) { req.body = req.failSafeBody; } next(); }); app.use(express.methodOverride()); 

Un simple cambio mostraría por qué no se ejecuta el siguiente:

 app.use('/paypal/ipn',function(req, res, next) { var postData=''; req.on('data', function(chunk) { postData += chunk; }); req.on('end', function() { req.rawBody = postData; console.log('ended buffering. result: ' + req.rawBody); console.log(next); }); }); 

Es probable que la próxima callback simplemente no exista y, por lo tanto, falle silenciosamente. Si SÍ existe, entonces solo tiene que ingresarlo y depurarlo línea por línea.

Tengo los mismos problemas así. Entonces, después de no encontrar una buena respuesta en google, pasé más horas para solucionarlo.

Debería notar que en el middleware de connect node_module, completó la lectura de datos en secuencia cuando llama a express.urlencoded (), así que encuentro una mejor manera de solucionar esos problemas:

 app.use(express.urlencoded()); app.use(function(req, res, next){ if (req.method !== 'POST' || JSON.stringify(req.body) !== JSON.stringify({})){ next() return } var data = '' req.on('data', function(chunk){ data += chunk }) req.on('end', function(){ req.rawBody = data next() }) }) 

¿Cómo funciona? Primero, completamos el flujo de lectura llamando a urlencoded () y obtuvimos la función req.body devuelta.

Después de eso, en la función rawBody de hackeo, verificamos si el método no es ‘POST’ (GET?) O req. Body no es igual a {}, lo que significa que urlencoded () analizó los datos con éxito, no necesitamos hacer nada (o si todavía necesita rawBody en este punto, simplemente se une () a req.body con ‘&’) así que simplemente llamamos a next () y regresamos para la función de ruptura

(sr, mi mal inglés, tengo muchas ganas de compartir esta exp, creo que la necesitarás como yo;))