处理承诺的管道

问题描述 投票:0回答:1

在我的应用程序中,我正在处理某种类型的文件。在上传过程中,我使用以下读取和写入流的管道:

import { pipeline } from 'stream';
import { promisify } from 'util';
const streamPipeline = promisify(pipeline);

try {
     await streamPipeline(file.stream(), fs.createWriteStream(tempPath));
} catch(err){
     console.log(err)
}

这种做

promisify(pipeline)
的一般方法似乎很常见,例如这篇文章

现在,当我上传损坏的文件时,我的整个应用程序崩溃了,并且我没有得到任何类型的错误输出,尽管它周围有一个 try-catch 块。我发现this可能就是原因。

不幸的是,我不知道如何合并git问题中建议的解决方案,因为我的例子中的回调是

pipeline

我看到 Node 中实际上有一个 promise 版本的 pipeline。我尝试过,但这并没有改变任何东西。

知道如何解决此问题并使代码片段在文件损坏的情况下更加健壮吗?

MWE(希望这样的作品):

try {
    const formData = await req.formData();
    let file;

    if (!(Array.from(formData.keys()).includes('file'))) {
        throw new Error('No file uploaded');
    } else {
        file = formData.get('file');
    }

    // Validate file type
    if (!file || typeof file !== 'object' || !file.name || !file.name.endsWith('.avro')) {
        throw new Error('Invalid file type. Only .avro files are allowed');
    }

    const tempDir = './temp';
    if (!fs.existsSync(tempDir)) {
        await fs.promises.mkdir(tempDir, { recursive: true });
    }

    const tempPath = `${tempDir}/${file.name}`;

    await streamPipeline(file.stream(), fs.createWriteStream(tempPath));
  } catch (error) {
      logger.error(error)
      return new Response("upload error", {
        status: 500,
      });
  }
node.js
1个回答
0
投票

我发现了为什么错误没有被捕获的问题。

此片段

await streamPipeline(file.stream(), fs.createWriteStream(tempPath));
或更一般地
promisify(pipeline)
根据节点版本的不同进行不同的处理。

最初我用 v22 尝试过,它完全崩溃了我的应用程序而没有捕获错误。

但是,对于 v20,该代码片段不会造成任何问题。但不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.