在我的应用程序中,我正在处理某种类型的文件。在上传过程中,我使用以下读取和写入流的管道:
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,
});
}
我发现了为什么错误没有被捕获的问题。
此片段
await streamPipeline(file.stream(), fs.createWriteStream(tempPath));
或更一般地promisify(pipeline)
根据节点版本的不同进行不同的处理。
最初我用 v22 尝试过,它完全崩溃了我的应用程序而没有捕获错误。
但是,对于 v20,该代码片段不会造成任何问题。但不知道为什么。