How do I require all files in a folder in node.js?
need something like:
files.forEach(function (v,k){
// require routes
require(\'./routes/\'+v);
}};
How do I require all files in a folder in node.js?
need something like:
files.forEach(function (v,k){
// require routes
require(\'./routes/\'+v);
}};
When require is given the path of a folder, it\'ll look for an index.js file in that folder; if there is one, it uses that, and if there isn\'t, it fails.
It would probably make most sense (if you have control over the folder) to create an index.js file and then assign all the \"modules\" and then simply require that.
yourfile.js
var routes = require(\"./routes\");
index.js
exports.something = require(\"./routes/something.js\");
exports.others = require(\"./routes/others.js\");
If you don\'t know the filenames you should write some kind of loader.
Working example of a loader:
var normalizedPath = require(\"path\").join(__dirname, \"routes\");
require(\"fs\").readdirSync(normalizedPath).forEach(function(file) {
require(\"./routes/\" + file);
});
// Continue application logic here
I recommend using glob to accomplish that task.
var glob = require( \'glob\' )
, path = require( \'path\' );
glob.sync( \'./routes/**/*.js\' ).forEach( function( file ) {
require( path.resolve( file ) );
});
Base on @tbranyen\'s solution, I create an index.js
file that load arbitrary javascripts under current folder as part of the exports
.
// Load `*.js` under current directory as properties
// i.e., `User.js` will become `exports[\'User\']` or `exports.User`
require(\'fs\').readdirSync(__dirname + \'/\').forEach(function(file) {
if (file.match(/\\.js$/) !== null && file !== \'index.js\') {
var name = file.replace(\'.js\', \'\');
exports[name] = require(\'./\' + file);
}
});
Then you can require
this directory from any where else.
Another option is to use the package require-dir which let\'s you do the following. It supports recursion as well.
var requireDir = require(\'require-dir\');
var dir = requireDir(\'./path/to/dir\');
I have a folder /fields full of files with a single class each, ex:
fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class
Drop this in fields/index.js to export each class:
var collectExports, fs, path,
__hasProp = {}.hasOwnProperty;
fs = require(\'fs\');
path = require(\'path\');
collectExports = function(file) {
var func, include, _results;
if (path.extname(file) === \'.js\' && file !== \'index.js\') {
include = require(\'./\' + file);
_results = [];
for (func in include) {
if (!__hasProp.call(include, func)) continue;
_results.push(exports[func] = include[func]);
}
return _results;
}
};
fs.readdirSync(\'./fields/\').forEach(collectExports);
This makes the modules act more like they would in Python:
var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
One more option is require-dir-all combining features from most popular packages.
Most popular require-dir
does not have options to filter the files/dirs and does not have map
function (see below), but uses small trick to find module\'s current path.
Second by popularity require-all
has regexp filtering and preprocessing, but lacks relative path, so you need to use __dirname
(this has pros and contras) like:
var libs = require(\'require-all\')(__dirname + \'/lib\');
Mentioned here require-index
is quite minimalistic.
With map
you may do some preprocessing, like create objects and pass config values (assuming modules below exports constructors):
// Store config for each module in config object properties
// with property names corresponding to module names
var config = {
module1: { value: \'config1\' },
module2: { value: \'config2\' }
};
// Require all files in modules subdirectory
var modules = require(\'require-dir-all\')(
\'modules\', // Directory to require
{ // Options
// function to be post-processed over exported object for each require\'d module
map: function(reqModule) {
// create new object with corresponding config passed to constructor
reqModule.exports = new reqModule.exports( config[reqModule.name] );
}
}
);
// Now `modules` object holds not exported constructors,
// but objects constructed using values provided in `config`.
One module that I have been using for this exact use case is require-all.
It recursively requires all files in a given directory and its sub directories as long they don\'t match the excludeDirs
property.
It also allows specifying a file filter and how to derive the keys of the returned hash from the filenames.
I know this question is 5+ years old, and the given answers are good, but I wanted something a bit more powerful for express, so i created the express-map2
package for npm. I was going to name it simply express-map
, however the people at yahoo already have a package with that name, so i had to rename my package.
1. basic usage:
app.js (or whatever you call it)
var app = require(\'express\'); // 1. include express
app.set(\'controllers\',__dirname+\'/controllers/\');// 2. set path to your controllers.
require(\'express-map2\')(app); // 3. patch map() into express
app.map({
\'GET /\':\'test\',
\'GET /foo\':\'middleware.foo,test\',
\'GET /bar\':\'middleware.bar,test\'// seperate your handlers with a comma.
});
controller usage:
//single function
module.exports = function(req,res){
};
//export an object with multiple functions.
module.exports = {
foo: function(req,res){
},
bar: function(req,res){
}
};
2. advanced usage, with prefixes:
app.map(\'/api/v1/books\',{
\'GET /\': \'books.list\', // GET /api/v1/books
\'GET /:id\': \'books.loadOne\', // GET /api/v1/books/5
\'DELETE /:id\': \'books.delete\', // DELETE /api/v1/books/5
\'PUT /:id\': \'books.update\', // PUT /api/v1/books/5
\'POST /\': \'books.create\' // POST /api/v1/books
});
As you can see, this saves a ton of time and makes the routing of your application dead simple to write, maintain, and understand. it supports all of the http verbs that express supports, as well as the special .all()
method.
I\'m using node modules copy-to module to create a single file to require all the files in our NodeJS-based system.
The code for our utility file looks like this:
/**
* Module dependencies.
*/
var copy = require(\'copy-to\');
copy(require(\'./module1\'))
.and(require(\'./module2\'))
.and(require(\'./module3\'))
.to(module.exports);
In all of the files, most functions are written as exports, like so:
exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };
So, then to use any function from a file, you just call:
var utility = require(\'./utility\');
var response = utility.function2(); // or whatever the name of the function is
Can use : https://www.npmjs.com/package/require-file-directory
If you include all files of *.js in directory example (\"app/lib/*.js\"):
example.js:
module.exports = function (example) { }
example-2.js:
module.exports = function (example2) { }
index.js:
module.exports = require(\'./app/lib\');