使用Node.js“流式传输”文件的每个新行

o2gm4chl  于 2022-11-04  发布在  Node.js
关注(0)|答案(1)|浏览(163)

我想一个接一个地读取文件中所有新添加的行,就像读取数据流一样。到目前为止,我使用chokidar来接收该文件每次更新的通知,然后,我使用read-last-lines传递数字1来指示我只想读取一行。

import fs from 'fs';
const  readLastLines = require('read-last-lines');
import chokidar from 'chokidar';

const logFile = 'log.txt';
// first checks if its exist
if (fs.existsSync(logFile)) { 
  // then start watching on every update
  chokidar.watch(logFile).on('change', (_event, _path) => {
      // read each update
      readLastLines.read(logFile, 1)
      .then((line: string) => {
          // do something with this received line.
         // Can't receive two or three lines if sent instantaneously
          doSomething(line);
      }).catch((err :any) => {
        console.log(err)
      })
 })
} else {
  console.log('File Not Found')
}

我工作得很好,除了当我得到两个或三个更新的文件瞬间。在这种情况下,我只能得到这个序列的最后一行更新。我想可能是chokidar有一个延迟在他的操作或我的操作系统是不允许文件正在写的另一个程序被读取,在同一时间由这个节点程序。
我想让它在终端上运行,如果它是一个程序输出(stdout)。(实际上,我的鼠标是用它来记录,从客户端,一个程序正在我的服务器上运行)。

k5ifujac

k5ifujac1#

可能有点晚了。有一个库可以让节点逐行处理类似日志的文件:tail
它的底层实现使用节点的fswatchwatchFile来实现这一点。
FYI:我会在您的代码中使用一个单独的文件来跟踪您已经处理了多少行,以提供nLines选项来实现崩溃恢复和一致性。

相关问题