[フレーム]
Last Updated: February 25, 2016
·
777
· 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

AltStyle によって変換されたページ (->オリジナル) /