#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);
}