处理NodeJS中潜在繁忙文件的正确方法是什么?

时间:2019-05-29 14:42:59

标签: javascript node.js asynchronous fs

我有一个NodeJS服务器来管理一些文件。它会监视来自外部进程的已知文件名,一旦收到,请先读取它,然后将其删除。但是,有时尝试在文件从先前的使用中“解锁”之前被读取/删除,因此很可能偶尔会失败。我想做的就是尽快完成此文件,或者以快的速度连续尝试。

我宁愿在可能的情况下避免长时间睡眠,因为这需要尽快处理,并且每一秒钟都很重要。

fs.watchFile(intput_json_file, {interval: 10}, function(current_stats, previous_stats) {

                var json_data = "";
                try {
                    var file_cont = fs.readFileSync(input_json_file); // < TODO: async this
                    json_data = JSON.parse(file_cont.toString());
                    fs.unlink(input_json_file);
                } catch (error) {
                    console.log("The JSON in the could not be parsed. File will continue to be watched.");
                    console.log(error);
                    return;
                }

                // Else, this has loaded properly.
                fs.unwatchFile(input_json_file);

                // ... do other things with the file's data.

}


// set a timeout for the file watching, just in case
setTimeout(fs.unwatchFile, CLEANUP_TIMEOUT, input_json_file);

我希望“ EBUSY:资源正忙或锁定” 偶尔会出现,但是解锁文件时并不总是调用fs.watchFile

我想创建一个函数,然后以1-10毫秒的延迟调用它,如果它也失败了,它可以在其中调用自己,但这听起来像是通往咳嗽的快速途径。咳嗽堆栈溢出。

我还想避免使用同步方法,以便可以很好地扩展,但是对于NodeJS而言,它相对较新,因此所有回调都开始变成迷宫。

1 个答案:

答案 0 :(得分:-1)

这个故事可能已经结束,但是您可以在完全控制的情况下创建自己的fs。在这种情况下,其他程序将直接将数据写入您的程序。只需按单词 fuse fuse-binding

进行搜索