Как вы используете модуль got node с узлом createWriteStream для загрузки изображения с помощью electron?

#node.js #electron

Вопрос:

Я просмотрел пару других ответов, но они мне не помогли.

узел версии 16.8.0 windows 10 «получил»: «11.8.2», электрон 14.0.0

Вот что я пытаюсь сделать. Приведенный ниже код действительно загружает файл, но createWriteStream выдает ошибку —

Не пойманный (в обещании) Ошибка типа [ERR_INVALID_RETURN_VALUE]: Ожидалось, что функция AsyncIterable или Promise будет возвращена из функции «назначение», но тип не определен.

Код в моем файле рендеринга

 module.exports.getTile = async function (url, outputFilePath) {
    const pipeline = promisify(stream.pipeline);

    await pipeline(
        got.stream(url),
        fs.createWriteStream(outputFilePath),
        (err) => {
            if (err) {
                console.error('Pipeline failed', err);
            } else {
                console.log('Pipeline succeeded');
            }
        });


    stream.finished(input, (err) => {
        if (err) {
            console.error('Stream failed', err);
        } else {
            console.log('Stream is done reading');
        }
    });
};
 

Я вызываю функцию с помощью await getTile(url, tilePath);

Комментарии:

1. Опустите обработчик завершения (3. аргумент) при использовании обещанной функции pipeline()

2. спасибо, если вы хотите поставить это в качестве ответа, я отмечу это правильно

Ответ №1:

stream.pipeline(...streams, callback) принимает n промежуточных программ потока и последний аргумент обратного вызова в соответствии с документацией.

util.promisify(...args, callback) принимает функцию с первым обратным вызовом с ошибкой и преобразует ее в асинхронную функцию, которая выдает ошибки. (документы)

Когда они будут объединены, util.promisify будет использоваться последний аргумент обратного stream.pipeline вызова и возвращать асинхронную функцию , которая принимает только промежуточные программы потока: util.promisify(stream.pipeline)(...streams) .

Следовательно, следующий фрагмент

 await pipeline(
        got.stream(url),
        fs.createWriteStream(outputFilePath),
        (err) => {
            if (err) {
                console.error('Pipeline failed', err);
            } else {
                console.log('Pipeline succeeded');
            }
        });
 

Следует переписать как:

 try {
  await pipeline(
    got.stream(url),
    fs.createWriteStream(outputFilePath)
  )
  console.log('Pipeline succeeded');
}
catch( error ){
  console.error('Pipeline failed', err);
}