【问题标题】:Throwned Error cannot be handled in createReadStream in Node.js using express-js使用 express-js 在 Node.js 中的 createReadStream 中无法处理抛出的错误
【发布时间】:2021-11-04 05:03:53
【问题描述】:

我正在尝试处理在 fs.createReadStream 中引发的异常,为此我使用了 Promise,但该错误终止了 API,尽管有 .catch。

我做错了什么?

这是我的测试代码:

fcts = require('./functions.js');

app.get('/test', function(req, res){
    console.log("OK TEST")
    fcts.test(req, res, '/data/file')
    .then(result => console.log("OK"))
    .catch(err => console.log("NO"))
})
module.exports = {
    test: function (request, response, fichier){
        return new Promise((resolve, reject) => {
            var flux = fs.createReadStream(fichier)
            .on('error', function(err){
                console.log("no")
                reject("reject")
            })
            .on('close', function(){
                console.log("end")
                resolve("ok")
            })
            .pipe(unzip.Parse())
            .on('entry', function (entry) {
                throw("uh")
            });
            console.log("end end")
        })
    }
}

这是我的日志:

...
OK TEST
end end

.../functions.js:1493
                        throw("uh")
                        ^
uh

我正在使用节点 8.16.0 和 express-js

谢谢!

【问题讨论】:

    标签: node.js express error-handling fs throw


    【解决方案1】:

    如果你拒绝而不是抛出它会起作用:

    
    .on('entry', function (entry) {
         reject(new Error('uh'));
    });
    
    

    在 Promise 定义函数中抛出由异步函数使用的回调将不起作用,因为它被抛出的上下文不是 promise 的上下文,而是 createReadStream 中的一个似乎没有在您使用on 定义的回调中引发异常时触发error 事件。

    事实上,在您的情况下,抛出的错误是UncaughtException,因为发生错误的上下文没有捕捉到它。由于它在异步上下文中,因此通知错误的是 node.js 上下文。

    为什么?可能是因为 error 事件仅针对流错误触发,而不是回调执行失败。

    在 nodejs 中运行脚本时,应使用标志 --trace-uncaught nodejs --trace-uncaught ./myfile.js。它会在发生未捕获的异常时提示您更多信息。

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2012-03-02
    • 2021-12-23
    • 2012-10-23
    • 2014-05-22
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多