未捕获的createReadStream承诺



我有一个从文件读取的基本代码,我想处理诸如无法打开文件之类的错误。下面是我的代码:

async function processFile() {
const fileStream = fs.createReadStream(source);
fileStream.on('error', function(err) {
console.log("An error occured while opening the file")
throw err
//return Promise.reject(err)
//return
});
}
async function main(){
try{
await processFile();
} catch(err){
console.error("catching error")
return
}
}
main()

我通常得到这样的结果:

An error occured while opening the file
catching error
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^
[Error: ENOENT: no such file or directory, open 'source.tx'] {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: 'source.tx'
}
Node.js v19.2.0

所以你可以看到,两个自定义消息都正确显示,但我仍然得到错误块,无论我使用throwreject()

代码的问题是什么,我如何解决它?

谢谢。

将函数标记为async不会使其自动处理嵌套函数中的错误

创建一个新的promise并使用reject函数参数拒绝错误

function processFile() {
return new Promise((resolve, reject) => {
const fileStream = fs.createReadStream(source);
fileStream.on("error", function (err) {
console.log("An error occured while opening the file");
reject(err);
});
});
}
async function main() {
try {
await processFile();
} catch (err) {
console.error("catching error");
return;
}
}
main();

另一种处理流错误的方法是使用finished方法。

根据doc:

当一个流不再可读、可写或发生错误或过早关闭事件时得到通知的函数。

在你的例子中:

const { finished } = require('stream/promises');
async function processFile() {
const fileStream = fs.createReadStream(source);
return finished(fileStream)
}
async function main(){
try{
await processFile();
} catch(err){
console.error("catching error", err)
return
}
}
main()

或者如果您想在错误范围内使用其他逻辑(例如:日志记录、…):

async function processFile() {
const fileStream = fs.createReadStream(source);
return finished(fileStream).catch((error) => {
console.log('An error occured while opening the file');
throw error;
})
...

相关内容

  • 没有找到相关文章

最新更新