Рубрики
Без рубрики

Файловый наблюдатель с Node.js

Простое руководство для создания файлового узла. Асинхронная логика, события, слушатели, обратные вызовы.

Автор оригинала: 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();