Last Updated: February 25, 2016
·
722
· matiasa18

Preload all controllers by folders on express.js app

The idea behind this was that:

First; I didn't like to set up my routes, I like them to set up by their selves.
Second; I wanted a structured MVC, not a simple one.

So for this, I changed the folder name of routes to controllers, and, on controllers/index.js file I added this code:

Let me know any suggestions please!

var fs = require('fs'),
    required_files = [];


module.exports = function(app) {
  recursive_require(__dirname, __dirname, app);

  function recursive_require(directory, base_dir, app) {
    fs.readdirSync(directory).forEach(function (input) {
      var next_directory = directory + '/' + input + '/';
      // If we are on the base dir, we ignore the index.js file
      if (!(required_files.indexOf(base_dir + '/index') > -1)) {
        required_files.push(base_dir + '/index');  
      }

      // Check if it's a directory
      if (fs.lstatSync(next_directory).isDirectory()) {
        // We require it recursively
        console.log('Reading directory ' + next_directory);
        recursive_require(next_directory.substr(0, next_directory.lastIndexOf('/')), base_dir, app);
      } else {
        // We require all (except the index.js file if the var is set to true) js files on folder
        require_files(directory, app);
        return;
      }
    });
  }

  function require_files(directory, app) {
    fs.readdir(directory, function(err, files) {
      files.forEach(function(file) {
        if (file.match(/\.js$/g)) {
          var file_path = directory + '/' + file;
          file_path = file_path.substr(0, file_path.indexOf('.js'));
          if (required_files.indexOf(file_path) == -1) {
            required_files.push(file_path);
            require(file_path)(app);
          }
        }
      });
    });
    return;
  }
}

Now on your controllers folder you could have a structure like this:

controllers
 admin
   posts
    add.js
     index.js
     remove.js
  home.js