Básicamente, estoy tratando de usar axios para descargar una imagen de una URL, pero aparece este error:
TypeError: streamResponse.data.pipe is not a function
Mi función para hacer la descarga de esta imagen está a continuación ( tenga en cuenta que esto está dentro de una clase ):
/** * Download poster */ async downloadPoster() { // Writer stream where we want to download the poster image const writer = fs.createWriteStream(this.poster.file); // This grabs the second part of the image url that we want const resultsResponse = await axios({ url: this.poster.url, method: 'GET', responseType: 'json', adapter: httpAdapter }); // Zero results if (resultsResponse.data.total_results <= 0) { logger.log(language[Config.language].posterNotFound + this.movie.title, 'error'); return false; } // Create the poster download URL var posterDownloadUrl = new URL(Config.api.posterUrl + resultsResponse.data.results[0].poster_path); const streamResponse = await axios({ url: posterDownloadUrl, method: 'GET', responseType: 'stream', adapter: xhrAdapter }); // Write data streamResponse.data.pipe(writer); return new Promise((resolve, reject) => { writer.on('finish', resolve); writer.on('error', reject); }); }Supongo que el adaptador para una respuesta de transmisión es el xhr. De todos modos, probé ambos adaptadores y ambos dan exactamente el mismo error. Sin embargo, ambas solicitudes suceden (puedo verlas en las herramientas de desarrollo).
Y para que no haya confusión, tengo los adaptadores importados en la parte superior del archivo:
const httpAdapter = require('axios/lib/adapters/http');
const xhrAdapter = require('axios/lib/adapters/xhr');
¿Qué podría estar haciendo mal aquí?
Aquí hay una versión más simple de su código.
Código:
const downloadImage = async (url) => { // Writer stream where we want to download the image const writer = fs.createWriteStream("./image.png"); const streamResponse = await axios({ url, method: 'GET', // that the point!!! // change responseType to stream // pipe only work with 'stream' responseType: 'stream' }); // Write data streamResponse.data.pipe(writer); writer.on('finish', () => console.log("Finished")); writer.on('error', () => console.error("Error while dowloading image")); } const imageLink = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1200px-Image_created_with_a_mobile_phone.png"; downloadImage(imageLink);Lo hice funcionar enviando la solicitud de descarga al hilo principal. No sé por qué, pero parece que no puede acceder a los datos de axios desde una secuencia en el archivo renderer.js . Sin embargo, ahora funciona después de echar un vistazo aquí:
si usa electrones , esta es una alternativa. en quasar funciona perfectamente. Recuerda poner main.js de electron nodeIntegration = true
const fs = require('fs-extra'); import path from 'path'; let url = 'yourl.com'; axios({ url, method: 'GET', responseType: 'blob' }).then((res) => { let fileName='myfile.zip' const dir = path.dirname(__dirname); const Path = path.resolve(`${dir}/dir`, 'subdir', fileName); const output = fs.createWriteStream(Path); const ws = new WritableStream(output) let blob = new Blob([res.data], {type: 'application/zip'}) const stream = blob.stream(); //optional //stream.pipeTo(ws).then(console.log('Done!!!')); stream.pipeTo(ws); })