node.js - 在 nodejs 中有效地跟踪文件
问题描述
我正在创建一个应用程序,它将监视一个文件并从该文件中获取内容(类似于 tail,但也可以在以前的数据中分页)。我阅读了很多解决方案,从生成新进程到仅获取文件的更新字节,但我仍然对某些部分感到有些困惑。
我想要做的是以下内容:
- 观察文件并在新数据进入文件时触发事件/回调
- 从文件中读取这些新数据并将其有效地发送给客户端。使用 websocket 或其他东西。(请提出一个好的方法来做到这一点)
- 在客户端,获取这些数据并将其显示给用户,并在新数据到来时不断更新它
- 如果用户请求旧数据从我们正在查看的文件中获取该数据的方法
我正在为上述子问题寻找有效的解决方案,也欢迎任何关于更好方法的建议。
仅供参考,我是 nodejs 的新手,因此您的解决方案中的冗长将不胜感激。
解决方案
留意变化
建议你看看chokidar,它是对原生 node.js 库 fs.watch、fs.events 的优化实现。
// 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 消息发送到服务器。服务器会将消息通知/广播给所需的客户端。
推荐阅读
- python - 如何将变量声明为参数并打印所需的子目录?
- javascript - 为什么我收到错误:网络错误 - 使用 axio.get?JSONP
- javascript - 如何在 ReactJS 中强制更新状态
- postgresql - 如何使用 pyodbc 将表从 MS Access 迁移到 Postgres?
- typescript - 事件溯源和 cqrs 与 eventstore db
- laravel - 产品导入 Laravel
- sumo - 相扑路由器找不到路线
- python - Python:NumPy 除以总和或将其替换为另一个
- c++ - SSL 不会被 libwebsockets 初始化:没有 LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT
- c - 一种 ASCII 算法会产生分段错误,而另一种则不会