Запись потока, возвращаемого node-fetch - PullRequest
1 голос
/ 26 марта 2019

README содержит следующий код в качестве примера записи извлеченного файла:

fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
    .then(res => {
        const dest = fs.createWriteStream('./octocat.png');
        res.body.pipe(dest);
    });

, к которому я бы добавил еще один .then() для использования файла, записанного на диск.в действительности кажется, что мой код запускается до того, как файл завершил запись на диск, поэтому мне приходит в голову, что обещание, возвращаемое вышеуказанным кодом, должно учитывать возникновение события 'end' в потоке.может быть что-то вроде этого:

fetch(url).then(res => new Promise((resolve, reject) => {
    const dest = fs.createWriteStream(fn);
    res.body.pipe(dest);
    res.body.on('end', () => resolve());
    dest.on('error', reject);
}));

но когда я пытаюсь запустить этот код, он жалуется:

TypeError: res.body.on не является функцией

, что имеет смысл, учитывая, что res.body выглядит так:

{ pipe: [Function: pipe] }

, то есть вообще не является потоком

два вопроса: 1) как я могуполучить доступ к актуальному потоку?2) если у меня нет доступа к нему, как я могу узнать, когда поток чтения закрылся, чтобы я мог разрешить?

ps

и нет, я могу 'получить поток из .pipe(), который возвращает неопределенное значение

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Насколько я могу судить, ваш код правильный.Я запустил

const fs = require("fs");
const fetch = require("node-fetch");

fetch("https://assets-cdn.github.com/images/modules/logos_page/Octocat.png")
  .then(
    res =>
      new Promise((resolve, reject) => {
        const dest = fs.createWriteStream("./tmp.txt");
        res.body.pipe(dest);
        res.body.on("end", () => resolve("it worked"));
        dest.on("error", reject);
      })
  )
  .then(x => console.log(x));

, и он работал точно так, как ожидалось, и напечатал "it worked"

0 голосов
/ 26 марта 2019

Я понял это.записываемый поток автоматически закрывается, когда читаемый закрывается.так что я могу зацепить это вместо:

fetch(url).then(res => new Promise((resolve, reject) => {
    const dest = fs.createWriteStream(fn);
    res.body.pipe(dest);
    dest.on('close', () => resolve());
    dest.on('error', reject);
}));
...