使用 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
。当它发生时,它会提示你更多关于未捕获异常的信息。
我正在尝试处理 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
。当它发生时,它会提示你更多关于未捕获异常的信息。