nœud.js exiger de tous les fichiers dans un dossier?

Comment puis-je avoir besoin de tous les fichiers dans un dossier dans un noeud.js?

besoin de quelque chose comme:

files.forEach(function (v,k){
  // require routes
  require('./routes/'+v);
}};
264
demandé sur Harry 2011-03-20 00:09:23

11 réponses

quand require est donné le chemin d'un dossier, il va chercher un index.fichier js dans ce dossier; si il y en a un, il utilise, et si il n'y a pas, il échoue.

il serait probablement plus logique (si vous avez le contrôle sur le dossier) de créer un index.js file et puis assigner tous les "modules" et puis simplement exiger que.

votre dossier.js

var routes = require("./routes");

de l'index.js

exports.something = require("./routes/something.js");
exports.others = require("./routes/others.js");

Si vous ne connaissez pas les noms de fichiers, vous devez écrire une sorte de chargeur.

exemple pratique d'un chargeur:

var normalizedPath = require("path").join(__dirname, "routes");

require("fs").readdirSync(normalizedPath).forEach(function(file) {
  require("./routes/" + file);
});

// Continue application logic here
442
répondu tbranyen 2015-12-29 22:48:27

je recommande d'utiliser glob pour accomplir cette tâche.

var glob = require( 'glob' )
  , path = require( 'path' );

glob.sync( './routes/**/*.js' ).forEach( function( file ) {
  require( path.resolve( file ) );
});
116
répondu Diogo Cardoso 2017-03-17 21:34:49

sur la base de la solution de @tbranyen, je crée un fichier index.js qui charge des javascripts arbitraires sous le dossier courant dans le cadre du 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);
  }
});

alors vous pouvez require ce répertoire de n'importe où ailleurs.

64
répondu Greg Wang 2015-04-21 23:07:47

une autre option consiste à utiliser le paquet require-dir ce qui vous permettra de faire ce qui suit. Il supporte aussi la récursion.

var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');
43
répondu studgeek 2015-04-09 16:06:38

j'ai un dossier /des champs remplis de fichiers avec une seule classe chacun, ex:

fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class

supprimez ceci dans les champs/index.js pour exporter chaque classe:

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);

cela rend les modules agir plus comme ils le feraient en Python:

var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
7
répondu blented 2013-04-23 05:50:52

une autre option est require-dir-all combinant des caractéristiques des paquets les plus populaires.

le plus populaire require-dir n'a pas d'options pour filtrer les fichiers/DRS et n'a pas la fonction map (voir ci-dessous), mais utilise un petit truc pour trouver le chemin courant du module.

Second par popularity require-all a regexp filtrage et prétraitement, mais manque de chemin relatif, donc vous devez utiliser __dirname (ce a des avantages et des inconvénients comme:

var libs = require('require-all')(__dirname + '/lib');

Mentionné ici require-index est assez minimaliste.

avec map vous pouvez faire certains prétraitement, comme créer des objets et passer des valeurs de configuration (en supposant que les modules ci-dessous exporte des constructeurs):

// 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`.
5
répondu alykoshin 2015-12-19 16:00:19

Un module que j'ai utilisé pour ce cas d'utilisation est exiger .

il exige récursivement tous les fichiers dans un répertoire donné et ses sous-répertoires tant qu'ils ne correspondent pas à la propriété excludeDirs .

il permet également de spécifier un filtre de fichier et comment dériver les clés du hash retourné à partir des noms de fichiers.

3
répondu Thorsten Lorenz 2013-07-31 21:34:03

je sais que cette question a plus de 5 ans, et les réponses données sont bonnes, mais je voulais quelque chose d'un peu plus puissant pour express, donc j'ai créé le paquet express-map2 pour npm. J'allais l'appeler simplement express-map , cependant le personnes chez yahoo ont déjà un paquet avec ce nom, donc j'ai dû renommer mon paquet.

1. utilisation de base:

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. 
});
Utilisation du contrôleur

:

//single function
module.exports = function(req,res){

};

//export an object with multiple functions.
module.exports = {

    foo: function(req,res){

    },

    bar: function(req,res){

    }

};

2. utilisation avancée, avec préfixes:

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
});

comme vous pouvez le voir, cela économise une tonne de temps et rend le routage de votre application très simple à écrire, à maintenir et à comprendre. il supporte tous les verbes http qu'express supporte, ainsi que la méthode spéciale .all() .

2
répondu r3wt 2016-12-03 13:15:10

j'utilise les modules de noeud copient-au module pour créer un fichier unique pour exiger tous les fichiers dans notre système basé sur NodeJS.

le code pour notre fichier utilitaire ressemble à ceci:

/**
 * Module dependencies.
 */

var copy = require('copy-to');
copy(require('./module1'))
.and(require('./module2'))
.and(require('./module3'))
.to(module.exports);

Dans tous les fichiers, la plupart des fonctions sont écrites comme des exportations, comme suit:

exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };

donc, pour utiliser n'importe quelle fonction d'un fichier, vous appelez simplement:

var utility = require('./utility');

var response = utility.function2(); // or whatever the name of the function is
1
répondu scottnath 2015-09-25 20:00:04

peut utiliser: https://www.npmjs.com/package/require-file-directory

  • Exiger sélectionné les fichiers avec le nom seulement ou tous les fichiers.
  • pas besoin de chemin d'abandon.
  • Facile à comprendre et à utiliser.
1
répondu Mayank Soni 2017-05-25 07:45:28

si vous incluez tous les fichiers de *.js dans l'exemple de répertoire ("app/lib/*.js"):

Dans le répertoire app/lib

exemple.js:

module.exports = function (example) { }

exemple-2.js:

module.exports = function (example2) { }

dans l'application de répertoire créer l'index.js

de l'index.js:

module.exports = require('./app/lib');
-1
répondu Faizal Pribadi 2014-07-29 05:50:17