Nodejs fs.createReadStream 事件错误
Nodejs fs.createReadStream event error
我正在尝试非常快速地从文件中读取数据(来自 ADC 的数据)。转换在打开文件时开始,在关闭时完成。我需要等待再次打开文件,等待当前转换完成。
我的问题是,当我快速打开文件时,nodejs 不会捕捉到预期的事件。知道如何解决这个问题吗?
node.on('input', function(){
readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log(`data: ${data}`);
})
}
readStream.on('open', () => {
console.log("file opened");
readyFlag = 0;
})
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
最后文件一直被打开。
所以在我看来这里的问题是 readStream
的上下文 - 它不是 input
回调的本地问题,这意味着每条消息都会覆盖对前一个流的引用。
当您增加消息的频率时,这开始失败的事实对我来说似乎是合乎逻辑的,因为流还没有机会完成,所以 readyFlag
永远不会重置。
这个问题的修复应该是字面上的一个衬里,使流成为本地变量
const readStream = ...
我想我已经解决了。 readyFlag 必须对输入范围是全局的,否则它将不起作用。我将 'open' 事件移到 if 语句中,它正在检查 readyFlag。这似乎解决了问题。现在系统没有挂起,文件只在读取完成并关闭之前打开的部分时才打开。
代码如下:
var readyFlag = 1;
node.on('input', function(msg){
const readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log('data read');
readyFlag = 0;
})
readStream.on('open', () => {
console.log("file opened");
})
}
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
我正在尝试非常快速地从文件中读取数据(来自 ADC 的数据)。转换在打开文件时开始,在关闭时完成。我需要等待再次打开文件,等待当前转换完成。
我的问题是,当我快速打开文件时,nodejs 不会捕捉到预期的事件。知道如何解决这个问题吗?
node.on('input', function(){
readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log(`data: ${data}`);
})
}
readStream.on('open', () => {
console.log("file opened");
readyFlag = 0;
})
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
最后文件一直被打开。
所以在我看来这里的问题是 readStream
的上下文 - 它不是 input
回调的本地问题,这意味着每条消息都会覆盖对前一个流的引用。
当您增加消息的频率时,这开始失败的事实对我来说似乎是合乎逻辑的,因为流还没有机会完成,所以 readyFlag
永远不会重置。
这个问题的修复应该是字面上的一个衬里,使流成为本地变量
const readStream = ...
我想我已经解决了。 readyFlag 必须对输入范围是全局的,否则它将不起作用。我将 'open' 事件移到 if 语句中,它正在检查 readyFlag。这似乎解决了问题。现在系统没有挂起,文件只在读取完成并关闭之前打开的部分时才打开。
代码如下:
var readyFlag = 1;
node.on('input', function(msg){
const readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log('data read');
readyFlag = 0;
})
readStream.on('open', () => {
console.log("file opened");
})
}
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})