44

我有以下用例:

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

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

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

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

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

4

3 回答 3

60

好消息是您可以使用 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');
    }
});

阅读这里关于 fs.watch(); 功能

编辑:您可以使用该功能

fs.watchFile(); 

阅读这里关于 fs.watchFile(); 功能

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

于 2012-12-04T07:36:34.873 回答
5

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

const watch = require('node-watch')

watch('README.md', function(event, filename) {
  console.log(filename, ' changed.')
})
于 2016-04-21T19:37:50.853 回答
2

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

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

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

于 2012-12-04T08:56:18.293 回答