Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js异步文件打开和读取操作出现越界错误_Javascript_Node.js_Fs - Fatal编程技术网

Javascript Node.js异步文件打开和读取操作出现越界错误

Javascript Node.js异步文件打开和读取操作出现越界错误,javascript,node.js,fs,Javascript,Node.js,Fs,我有以下功能来查找文件中的更改,打开文件并读取所述更改。为此,我使用fs.statSync来计算缓冲区的长度 var allFiles=[logfile] allFiles.forEach (function (file) { var fName = file; var fNameStat = new Object; fNameStat = fs.statSync(fName); if (!fNameStat.isFile()) { console.log(fName

我有以下功能来查找文件中的更改,打开文件并读取所述更改。为此,我使用fs.statSync来计算缓冲区的长度

var allFiles=[logfile]
allFiles.forEach (function (file) {
  var fName = file;
  var fNameStat = new Object;

  fNameStat = fs.statSync(fName);

  if (!fNameStat.isFile()) {
    console.log(fName + ' is not a file');
    process.exit(1);
  }

  console.log('watching ' + fName + ' bytes: ' + fNameStat.size);

  fs.watch(fName, function (event, filename) {
    var fNameStatChanged = fs.statSync(fName);
    console.log('file changed from ' + fNameStat.size + ' to ' + fNameStatChanged.size);
    fs.open(fName, 'r', function(err, fd) {
    var newDataLength = fNameStatChanged.size - fNameStat.size;
    var buffer = new Buffer(newDataLength, 'utf-8');
    fs.readSync(fd, buffer, 0, newDataLength, fNameStat.size, function (err, bytesRead, newData) {
     if (err) {
        console.log(err);
     };
     logline = newData.toString()
     console.log(logline);
    socket.emit("log-tail",logline);
  });
  fNameStat = fs.statSync(fName);
});

}); // fs.watch

}); // allFiles.forEach
但我得到了一个边界外的缓冲区错误。当日志文件依次收到两条消息时,就会发生这种情况

file changed from 40756 to 40789
file changed from 40756 to 40844
fs.js:620
  binding.read(fd, buffer, offset, length, position, req);
          ^

Error: Offset is out of bounds

我假设这与异步调用有关。文件在第一次读取操作完成之前更改,因此缓冲区错误。但即使在使用了相应的同步调用之后,代码也无法工作。有什么想法吗?

你有没有尝试限制fs.watch活动?@mh cbon没有。我也不知道该怎么做。你的意思是我应该只关注某些类型的更改,还是它是一个nodejs函数。我对这一切都是陌生的,所以道歉,我也不想失去任何改变事件。我基本上实现了tail-f功能,因此需要跟踪对文件的所有更改我怀疑这两个是连续的
文件从40756更改为40789
文件从40756更改为40844
。如果只捕获最后一个,则不会丢失任何数据,因为它们从同一偏移开始。顺便说一句,如果你成功地连续读取了这两个数据,你会将40756到40789的数据发送到另一端两次。是的。但问题是,当两个更改具有相同的启动缓冲区时,如何捕获此类事件。有没有办法知道任何并发挂起的调用