【问题标题】:File watching in Node.jsNode.js 中的文件监视
【发布时间】:2013-12-23 06:48:57
【问题描述】:

我正在编写一个 Node.js 服务器,它监视一个充满空文件的目录以进行更改。当文件更改时,它会通知客户端,然后清空文件。手表代码是:

fs.watch("./files/", function(event, targetfile){
        console.log(targetfile, 'is', event)
        fs.readFile("./files/"+targetfile, 'utf8', function (err,data) {
                if (err) {
                        return console.log(err);
                }
                if (data=="") return; //This should keep it from happening
                //Updates the client here
                fs.truncate("./files/"+targetfile, 0);
        });
});

change 事件发生了两次,因此客户端被更新了两次。这不可能发生。它就像 watch 函数同时被调用两次,并且都在任何一个可以到达 truncate 命令之前执行。我如何防止这种情况发生?比如说,我不能阻止一个线程,因为我需要它实时响应其他文件。

感谢您的帮助。我是 Node.js 的新手,但到目前为止我很喜欢它。

【问题讨论】:

  • 第二个事件被你截断文件触发...
  • 这不是因为它用数据更新客户端两次。

标签: javascript node.js inotify


【解决方案1】:

您可以使用下划线实用方法Once 来防止函数执行多次。你必须让你的代码看起来像这样:

var func = _.once(function(targetfile){
    fs.readFile("./files/"+targetfile, 'utf8', function (err,data) {
        if (err) {
                return console.log(err);
        }
        if (data=="") return; //This should keep it from happening
        //Updates the client here
        fs.truncate("./files/"+targetfile, 0);
    });
});
fs.watch("./files/", function(event, targetfile){
    console.log(targetfile, 'is', event);
    func(targetfile);
});

如果您希望它执行多次,但又想过滤掉重复的事件,您可以使用throttledebounce 等函数。

【讨论】:

  • 油门看起来像我想要的......我会尝试它,如果它有效,我会接受答案。
  • 我错了。 debounce 是我想要的。但它奏效了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2017-01-19
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多