Tenemos una aplicación construida en nodejs (Servidor A), que está obteniendo datos de otra aplicación de nodejs (Servidor B) usando REST API.
De manera similar, para descargar archivos, el servidor A realiza una solicitud en el servidor B y el servidor B obtiene archivos de AWS S3 y canaliza los datos de regreso al servidor A.
Este sistema funciona perfectamente y somos capaces de descargar archivos de hasta 1GB.
El problema es que a veces el Servidor A falla con el siguiente error:
buffer.js:488 throw new Error('toString failed'); ^ Error: toString failed at Buffer.toString (buffer.js:488:11) at Request.<anonymous> (/var/www/sky/portal/node_modules/request/request.js:1145:39) at emitOne (events.js:95:20) at Request.emit (events.js:182:7) at IncomingMessage.<anonymous> (/var/www/sky/portal/node_modules/request/request.js:1091:12) at IncomingMessage.g (events.js:273:16) at emitNone (events.js:85:20) at IncomingMessage.emit (events.js:179:7) at endReadableNT (_stream_readable.js:913:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickCallback (internal/process/next_tick.js:98:9)El servidor A está llamando al servidor B usando el siguiente código:
exports.downloadAsset = function(req, res, assetUrl, cb) { res.cookie('fileDownload', 'true'); request( config.api.baseUrl + assetUrl , function(error, response, body) { } ).pipe(res); }No estamos seguros de dónde se bloquea la aplicación. Por favor recomiende.
La solución que usé para ordenar el problema anterior: tuve que modificar nuestro flujo. Estábamos transmitiendo datos del Servidor B al Servidor A, pero ahora el Servidor B envía una URL firmada al Servidor A y el archivo se descarga directamente desde S3 usando esa URL firmada.