使用 util.promisify 和 async/await 循环中的流管道有什么问题

what is wrong with this stream pipeline in a loop using util.promisify and async/await

我有一组图片网址。我尝试循环加载它们,调整它们的大小并保存到文件系统。 首先我遇到了问题,那个请求只是实现流接口,但我不能像这样直接在管道中使用它:await pipeline(request, imgstream, writableStream) - 通过将请求与管道结合解决了这个问题。

代码如下:

async function processImage(url) {
    try {
      const pipeline = util.promisify(stream.pipeline);
      const resizeTransform = sharp()
        .resize(160, 105);
      const imgstream = request(url).pipe(resizeTransform);
      const localFile = getLocalUrl(url);
      const writableStream = fs.createWriteStream(localFile);
      await pipeline(imgstream, writableStream);
    } catch (err) {
      console.log(err);
    }
}

urlArr.forEach(processImage);

如果我 运行 这有 100 张图像,它可以很好地处理 30...50 张图像,但其余图像的文件大小为 0 字节,控制台打印如下: 错误:读取 ECONNRESET 在 TCP.onStreamRead (internal/stream_base_commons.js:162:27)

我目前使用的是 win 10 计算机。 代码可能有什么问题?

实际上你的代码是错误的。您正在调用 urlArr.forEach(processImage);,因为 processImage 是一个 异步 函数,forEach 的默认实现不会 await 作为范围。你需要这样的东西来 await 函数:

for(let i=0; i< urlArr.length; i++){
  await processImage(urlArr[i]);
}