我被这个问题困扰。我试图将包含文本文件每行子字符串的对象推到fs linereader范围之外的数组。我几乎肯定我的数组在正确的范围内,但我的数组总是空着。
代码运行没有任何错误,我什至可以从文本文件中打印出每一行都没问题。
我正在尝试使用Node从文本日志文件中获取行,并将每行的各个部分推送到db。
var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
.on('add', function(path) {
var myArray = [];
console.log('File', path, 'has been added');
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream(path)
});
lineReader.on('line', function (l) {
l.toString();
myArray.push({
"date" : l.substring(25,35),
"time" : l.substring(35,46)
});
});
console.log(myArray); //Always empty
})
.on('change', function(path) {console.log('File', path, 'has been changed');})
.on('unlink', function(path) {console.log('File', path, 'has been removed');})
.on('error', function(error) {console.log('Error happened', error);});
我希望控制台向我显示该数组,但是它始终为空。
答案 0 :(得分:0)
获得空数组的原因是因为ReadLine将回调添加到IO event queue
中,并且它将在当前执行脚本完成后执行。因此,看起来就像定义数组并将其打印在下一行。为了将数组中的所有值打印出来,您只需要在lineReader ReadLine object
上为close
事件添加一个侦听器。
下面是带有close
事件的更新代码。
var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
.on('add', function(path) {
var myArray = [];
console.log('File', path, 'has been added');
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream(path)
});
lineReader.on('line', function (l) {
l.toString();
myArray.push({
"date" : l.substring(25,35),
"time" : l.substring(35,46)
});
});
lineReader.on('close', function () {
console.log(myArray);
})
})
.on('change', function(path) {console.log('File', path, 'has been changed');})
.on('unlink', function(path) {console.log('File', path, 'has been removed');})
.on('error', function(error) {console.log('Error happened', error);});