2017-06-21 1 views
1

Je crée une application Electron et je veux diffuser une image dans un fichier (donc je la télécharge en gros).Réponse du flux au fichier en utilisant Fetch API et fs.createWriteStream

Je veux utiliser l'API Fetch native car le module de requête serait un gros surcoût.

Mais il n'y a pas de méthode de conduite sur la réponse, donc je ne peux pas faire quelque chose comme

fetch('https://imageurl.jpg') 
    .then(response => response.pipe(fs.createWriteStream('image.jpg'))); 

Alors, comment puis-je combiner fetch et fs.createWriteStream?

Répondre

1

Je l'ai fonctionné. J'ai fait une fonction qui transforme la réponse en un flux lisible.

const responseToReadable = response => { 
    const reader = response.body.getReader(); 
    const rs = new Readable(); 
    rs._read = async() => { 
     const result = await reader.read(); 
     if(!result.done){ 
      rs.push(Buffer.from(result.value)); 
     }else{ 
      rs.push(null); 
      return; 
     } 
    }; 
    return rs; 
}; 

donc avec elle, je peux faire

fetch('https://imageurl.jpg') 
    .then(response => responseToReadable(response).pipe(fs.createWriteStream('image.jpg'))); 
0

Fetch n'est pas vraiment capable de fonctionner avec Streams dès sa sortie de la boîte, car l'API Fetch est basée sur un navigateur et les flux sont une chose nodejs. Le module electron-fetch semble résoudre cela pour vous. Ou vous pouvez regarder cette réponse: https://stackoverflow.com/a/32545850/2016129 pour avoir un moyen de télécharger des fichiers sans avoir besoin de nodeIntegration.

Il existe également needle, une alternative plus petite à la requête plus volumineuse, qui prend bien sûr en charge les flux.