Автор оригинала: Stefano Maglione.
В этой статье я собираюсь объяснить, как создать файловый наблюдатель в Node.js, который постоянно проверяет файл содержимого исходного папки и перемещает содержимое в корпусе опускания папки назначения.
Это отличный способ понять, как слушатели и обратные вызовы взаимодействуют друг с другом и как работать с асинхронной логикой!
Просто для удовольствия и тренировки я написал наблюдателя как в ES5, так и ES6.
ES6 версия:
const events = require("events"), util = require("util"); const fs = require("fs"), watchDir = "./watch", processedDir = "./done"; /*Let's extend events.EventEmitter in order to be able to emit and listen for event*/ class Watcher extends events.EventEmitter { constructor(watchDir, processedDir) { super(); this.watchDir = watchDir; this.processedDir = processedDir; } /* Cycles through directory and process any file found emitting a process event for each one*/ watch() { const watcher = this; fs.readdir(this.watchDir, function(err, files) { if (err) throw err; for (let index in files) { watcher.emit("process", files[index]); } }); } /* Start the directory monitoring leveraging Node's fs.watchFile */ start() { var watcher = this; fs.watchFile(watchDir, function() { watcher.watch(); }); } } /* Let's instantiate our Watcher object passing to the constructor our folders path */ let watcher = new Watcher(watchDir, processedDir); /*Let's use the on method inherited from event emitter class to listen for process events and move files from source folder to destination*/ watcher.on("process", function process(file) { const watchFile = this.watchDir + "/" + file; const processedFile = this.processedDir + "/" + file.toLowerCase(); fs.rename(watchFile, processedFile, function(err) { if (err) throw err; }); }); /*Start it!!!*/ watcher.start();
Теперь вы можете создать папки и запустить скрипт с узлом. Повеселись!
И это версия ES5:
var events = require("events"), util = require("util"); var fs = require("fs"), watchDir = "./watch", processedDir = "./done"; function Watcher(watchDir, processedDir) { this.watchDir = watchDir; this.processedDir = processedDir; } util.inherits(Watcher, events.EventEmitter); Watcher.prototype.watch = function() { var watcher = this; fs.readdir(this.watchDir, function(err, files) { if (err) throw err; for (var index in files) { watcher.emit("process", files[index]); } }); }; Watcher.prototype.start = function() { var watcher = this; fs.watchFile(watchDir, function() { watcher.watch(); }); }; var watcher = new Watcher(watchDir, processedDir); watcher.on("process", function process(file) { var watchFile = this.watchDir + "/" + file; var processedFile = this.processedDir + "/" + file.toLowerCase(); fs.rename(watchFile, processedFile, function(err) { if (err) throw err; }); }); watcher.start();