【问题标题】:Observe file changes with node.js使用 node.js 观察文件变化
【发布时间】:2020-08-10 15:04:18
【问题描述】:

我有以下用例:

A 创建一个聊天并邀请 B 和 C - 在服务器上 A 创建一个 文件。 A、B 和 C 将消息写入此文件。 A、B 和 C 读到这个 文件。

我想在服务器上创建一个文件并观察这个文件,如果其他人在这个文件中写了一些东西,用 websockets 把新内容发回。

因此,我的 node.js 应用程序应观察此文件的任何更改。

如何观察文件变化?在不锁定文件的情况下使用 node js 是否可行?

如果不能使用文件,是否可以使用数据库对象 (NoSQL)

【问题讨论】:

    标签: node.js


    【解决方案1】:

    好消息是您可以使用 Node 的 API 观察文件更改。

    但是,这不会让您访问已写入文件的内容。 您也许可以使用fs.appendFile(); 函数,以便在将某些内容写入文件时向其他“记录”正在写入的新数据的其他内容发出事件。

    fs.watch(): 直接从文档粘贴

    fs.watch('somedir', function (event, filename) {
        console.log('event is: ' + event);
        if (filename) {
            console.log('filename provided: ' + filename);
        } else {
            console.log('filename not provided');
        }
    });
    

    Read here about the fs.watch(); function

    EDIT:您可以使用该功能

    fs.watchFile(); 
    

    Read here about the fs.watchFile(); function

    这将允许您查看文件的更改。 IE。每当它被其他任何类型的进程访问时。

    【讨论】:

    • 感谢您的意见。在我看来,这意味着您可以使用 fs.watch 观察文件名的变化。但是在这个页面上,我找到了 fs.readStream 和 fs.writeStream。也许这有可能。
    • 我想这取决于您要如何观察文件,不是吗?如果您的目标是观察实际变化,即。然后写的是 fs.watchFile();你应该使用的。这是每当访问文件时。我会更新我的答案。
    • 我同意,我会测试它,文件不能被锁定。它有效,我给你我的√
    • 我建议不要使用 fs.watchFile(),因为它在不同的操作系统等上存在问题。请改用github.com/paulmillr/chokidar
    • 是的,这是真的,但我不知道这个 api 确实存在!我自己没有使用过它,如果 OP 可以使用 3rd 方库,那就太好了! :) 既然我知道了,我自己会在家里将我的东西升级到这个库。
    【解决方案2】:

    您也可以使用node-watch。这是一个简单的例子:

    const watch = require('node-watch')
    
    watch('README.md', function(event, filename) {
      console.log(filename, ' changed.')
    })
    

    【讨论】:

    • 您已从您的 自己的 存储库中为 5 行代码链接到场外。请将这些行编辑成问题而不是链接。
    • 感谢您的建议!我开始回答问题,这对我提高自己有很大帮助:)
    【解决方案3】:

    我认为您不需要观察文件更改或为此使用 NoSQL 数据库(如果您不想这样做)。我的建议是查看events(Observer pattern)。网上有足够多的关于这个主题的教程(谷歌)。比如Felix关于Using EventEmitters的文章

    这种发布/订阅语义也可以通过 NoSQL 实现。以Redis 为例,我认为你应该看看pubsub

    在 MongoDB 中,我认为 tailable cursors 是您正在寻找的。在他们的博客上,他们有一篇解释 pub/sub 的帖子。

    【讨论】:

    • 嗨 Alfred,如果我不能使用 node.js,pubsub 和表游标听起来就像我需要的一样。谢谢。
    • 嗨 Sam,实际上 EventEmitter 是 NodeJS 的一部分,并且确实是推荐的方式来执行类似 pubsub 的行为(比使用文件简单得多)。除非您使用该文件进行持久化,但即便如此,请查看 EventEmitter,因为它的设置非常简单。
    • 就像 mtsr 所说的那样。 EventEmitter 是 NodeJS 的一部分。
    • 在我的用例中,我需要有文件或数据库,因为我需要监听来自不同服务器的事件。我有不止一台服务器想要在同一个实例上收听。
    • 多服务器我会考虑 Redis pubsub,它既快速又简单,但如果您的一个服务器出现故障或全力以赴并使用像 rabbitmq.com 和 @987654329 这样的消息队列,则会丢失事件@。这为您提供了至少一次交付的保证,并允许持久消息传递(消息在重新启动时保存)。 RabbitMQ + AMQP 也很容易设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2018-07-05
    相关资源
    最近更新 更多