这是一段代码:
'use strict';
let fs = require('fs');
module.exports = (fileName, res) => {
fs.createReadStream(fileName)
.pipe(res)
.on('error', err => {
console.log('==========>> ERROR : ' + err.message);
res.statusCode = 500;
res.end('Internal Server Error: 500');
})
.on('end', res.end);
};
当指定错误的“fileName”时,服务器崩溃时出现“ ENOENT:no such file or directory ”消息。
为什么此代码没有捕获 .on('error',...)块中的错误?
谢谢!
答案 0 :(得分:1)
乍一看,我认为你实际上并没有将它附加到读取流中(正如我想出的那样)。
请参阅Stream.pipe()文档:
readable.pipe()方法返回对目标的引用 流可以建立管道流链
目标流没有任何错误,因此不会调用错误回调。
尝试:
module.exports = (fileName, res) => {
fs.createReadStream(fileName)
.on('error', err => {
console.log('==========>> ERROR : ' + err.message);
res.statusCode = 500;
res.end('Internal Server Error: 500');
})
.on('end', res.end)
.pipe(res);
};
......或(更清晰,更不可靠):
module.exports = (fileName, res) => {
var iStream = fs.createReadStream(fileName);
iStream.on('error', err => {
console.log('==========>> ERROR : ' + err.message);
res.statusCode = 500;
res.end('Internal Server Error: 500');
});
iStream.on('end', res.end);
var oStream = iStream.pipe(res) // returns refernce to the output stream (actually res);
};
...另一方面,如果文件不存在,我不确定是否实际创建了流。
可能fs.createReadStream()
本身会在实际创建流之前抛出错误,因此,您应该将其包含在try {...} catch(){...}
块中。
无论如何,我不确定。如果createReadStream()在打开文件之前创建流然后抛出错误(在流上),如果文件实际上不存在,那将更方便(从编码的角度来看)。但是这应该在之前进行调查或测试。