Node.js retroalimentación indicador de progreso

Tengo una pregunta sobre el progreso del envío con la ‘solicitud’ de Node.js. Tengo una aplicación Node.js que actúa como proxy, en realidad reenviando un cuerpo a otro servidor. Quiero ver el progreso de esta acción de carga. Ahora estoy haciendo esto:

BROWSER -> UPLOAD TO NODE -> UPLOAD TO 3rd PARTY SERVICE -> RETURN 3rd PARTY RESPONSE TO BROWSER 

Si esto es posible, lo registraría para verificar en la consola.log cuánto progreso se ha realizado. Pero, ¿sería también posible devolver un

 res.send(progress) 

¿Mientras tanto, mientras espera que finalice la carga y envíe al cliente de vuelta, la carga ha tenido éxito?

 BROWSER -> UPLOAD TO NODE -> UPLOAD TO 3rd PARTY SERVICE -> RETURN progress  RETURN progress  RETURN 3rd PARTY RESPONSE TO BROWSER 

Este es el código de carga (bastante sencillo).

 var requestOptions = { timeout: 120000, url: url, //URL to hit method: 'post', headers: headers, body: payload //Set the body as a string }; request(requestOptions, function (error, response, body) { if (error) { res.send(error); } else { //res.sendStatus(response.statusCode); console.log("[RETURNING RESPONSE BODY]"); res.send(body); } }); 

Su pregunta contiene dos partes. Una es para obtener el progreso de la solicitud, que se puede encontrar aquí: Subir progreso – Solicitud

La otra parte sería notificar al navegador del progreso. El protocolo HTTP no le permite enviar múltiples respuestas, por lo que no es posible utilizar res.send(progress) .

Sin embargo, puedes seguir enviando respuestas parciales hasta que termine. Escribir algo para resolver sin cerrarlo es tan simple como res.write("string") , pero acceder a la respuesta puede ser más difícil: ¿ Acceder a la respuesta parcial utilizando AJAX o WebSockets?

También necesita una forma de envolver el cuerpo (y también los errores) del servidor de respaldo para que pueda encajar como la respuesta parcial final.

Otra solución sería abrir otra solicitud de WebSocket para rastrear el proceso de carga / descarga. socket.io es una buena biblioteca para nodo para este propósito.

La solución para la primera parte estaba en r.req.connectin.bytesWritten

 var r = request(requestOptions, function (error, response, body) { clearInterval(q); ... }); var q = setInterval(function () { console.log("Uploaded: " + r.req.connection.bytesWritten); }, 250);