Tal vez la pregunta no esté redactada de la mejor manera, pero aquí hay más contexto. Usando GridFSBucket, puedo almacenar un archivo en mongo y obtener una secuencia de descarga para ese archivo. Aquí está mi pregunta. Digamos que quiero enviar ese archivo como respuesta a mi solicitud http.
Hago:
downloadStream.pipe(res);Ahora, en el lado del cliente, cuando imprimo el texto de respuesta, obtengo una cadena larga con algunos caracteres funky que parecen estar encriptados. ¿Cuál es el formato/tipo de esta cadena/flujo? ¿Cómo configuro mi respuesta para poder obtener los datos transmitidos como ArrayBuffer en mi lado del cliente?
Gracias
ACTUALIZAR:
Todavía no he resuelto el problema, sin embargo, la sugerencia de @Jekrb da exactamente el mismo resultado que hacer console.log(this.responseText) . Parece que la cadena no es un búfer. Aquí está el resultado de estas 2 líneas:
console.log(this.responseText.toString('utf8'))
var byteArray = new Uint8Array(arrayBuffer);
ACTUALIZACIÓN 2 - LOS SNIPPETS DE CÓDIGO
Interfaz:
var savePDF = function(blob){ //fs.writeFile("test.pdf",blob); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200){ //TO DO: Handle the file in the response which we will be displayed. console.log(this.responseText.toString('utf8')); var arrayBuffer = this.responseText; if (arrayBuffer) { var byteArray = new Uint8Array(arrayBuffer); } console.log(arrayBuffer); } }; xhr.open("POST","/pdf",true); xhr.responseType = 'arrayBuffer'; xhr.send(blob); };BACKEND:
app.post('/pdf',function(req,res){ MongoClient.connect("mongodb://localhost:27017/test", function(err, db) { if(err) return console.dir(err); console.log("Connected to Database"); var bucket = new GridFSBucket(db, { bucketName: 'pdfs' }); var CHUNKS_COLL = 'pdfs.chunks'; var FILES_COLL = 'pdfs.files'; // insert file var uploadStream = bucket.openUploadStream('test.pdf'); var id = uploadStream.id; uploadStream.once('finish', function() { console.log("upload finished!") var downloadStream = bucket.openDownloadStream(id); downloadStream.pipe(res); }); // This pipes the POST data to the file req.pipe(uploadStream); }); });Supongo que la respuesta se emite como un binario simple que no está codificado en base64 (sigue siendo un búfer) o es una respuesta comprimida (gzip) que primero debe descomprimirse.
Sin embargo, es difícil identificar el problema sin ver el código.
ACTUALIZAR:
Parece que te faltan los encabezados de respuesta adecuados.
Intente configurar estos encabezados antes de downloadStream.pipe(res) :
res.setHeader('Content-disposition', 'attachment; filename=test.pdf'); res.set('Content-Type', 'application/pdf');Es probable que su transmisión ya sea un búfer. Es posible que pueda llamar a responseText.toString('utf8') para convertir los datos transmitidos en una cadena legible.
¡¡¡Lo resolví!!!
Básicamente, preestablezca el tipo de respuesta en "arraybuffer" antes de realizar la solicitud usando req.responseType = "arraybuffer"
Ahora, una vez que reciba la respuesta, no use responseText , en su lugar use response . La response contiene el arraybuffer con los datos del archivo.