使用 express-js 无法在 Node.js 的 createReadStream 中处理抛出的错误

Throwned Error cannot be handled in createReadStream in Node.js using express-js

我正在尝试处理 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

谢谢!

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


.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。当它发生时,它会提示你更多关于未捕获异常的信息。