【问题标题】:Tail a file efficiently in nodejs在 nodejs 中有效地跟踪文件
【发布时间】:2018-07-25 11:20:28
【问题描述】:

我正在创建一个应用程序,它将监视一个文件并从该文件中获取内容(类似于 tail,但也可以在以前的数据中分页)。我阅读了很多解决方案,从生成新进程到仅获取文件的更新字节,但我仍然对某些部分感到有些困惑。

我真正想做的是:

  • 观察文件并在新数据进入文件时触发事件/回调
  • 从文件中读取这些新数据并有效地将其发送给客户端。使用 websocket 或其他东西。 (请提出一个好的方法)
  • 在客户端,获取此数据并将其显示给用户,并在新数据出现时不断更新它
  • 如果用户请求旧数据,可以从我们正在查看的文件中获取该数据

我正在为上述子问题寻找有效的解决方案,也欢迎任何关于更好方法的建议。

仅供参考,我是 nodejs 的新手,因此非常感谢您提供详细的解决方案。

【问题讨论】:

    标签: node.js fs tail


    【解决方案1】:

    留意变化

    建议你看看chokidar,它是fs.watch、fs.events、原生node.js库的优化实现。

    // Initialize watcher.
    const watcher = chokidar.watch('some/directory/**/*.xml', config);
    
    // Add event listeners.
    watcher
      .on('add', path => log(`File ${path} has been added`))
      .on('change', path => log(`File ${path} has been changed`))
      .on('unlink', path => log(`File ${path} has been removed`));
    

    获取更改后的值

    在这里你可以查看diff 模块。您将需要存储以前和当前文件的状态。为了构建更改。

    通知客户

    您需要创建一个 websocket 服务器,建议您使用socket.io,然后在您的应用程序中创建差异并将 websocket 消息发送到服务器。服务器会将消息通知/广播给所需的客户端。

    【讨论】:

    • 感谢您的回答。还请就如何从文件中获取这些更改的数据以及将该数据发送到客户端的好方法提出建议。
    • @amaze-name 更新了答案。
    • diff 模块很棒,但是如果我必须计算文件中新增内容的差异,那么我要么必须保留上一个文件的副本,要么在检查差异之前将其内容存储在某处。问题是我正在检查新内容的文件可能很大,我不希望节点应用占用太多资源。
    • 一个想法可以是使用一个版本控制系统,它只存储从一个版本到另一个版本的补丁。只给你新的东西是不可能的,因为你假设你的文件只会被附加,但是如果文件被修改,或者行被删除,那么会有什么区别?
    猜你喜欢
    • 2023-03-10
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2020-09-26
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多