So I am basically trying to use axios to download a image from a url, but I get this error:
TypeError: streamResponse.data.pipe is not a function
My function for doing this image download is below (note that this is inside a class):
/** * 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); }); }
I assume that the adapter for a stream response is the xhr one. Anyways, I have tried both adapters and both gives the exact same error. Both requests does happen though (I can see them in the devtools).
And so there’s no confusion, I have the adapters imported at the top of the file:
const httpAdapter = require('axios/lib/adapters/http');
const xhrAdapter = require('axios/lib/adapters/xhr');
What could I be doing wrong here?
Advertisement
Answer
Got it working by sending the download request over to the main thread. Don’t know why, but seems you can’t access the axios data from a stream in the renderer.js
file. Got it working now though after having a look here: