javascript - sintaxis - node js tutorial
¿node.js requiere todos los archivos en una carpeta? (11)
¿Cómo requiero todos los archivos en una carpeta en node.js?
necesita algo como
files.forEach(function (v,k){
// require routes
require(''./routes/''+v);
}};
Cuando se le asigna la ruta de acceso a una carpeta, buscará un archivo index.js en esa carpeta; si hay uno, usa eso, y si no lo hay, falla.
Probablemente tendría más sentido (si tiene control sobre la carpeta) crear un archivo index.js y luego asignar todos los "módulos" y luego requerirlo.
yourfile.js
var routes = require("./routes");
index.js
exports.something = require("./routes/something.js");
exports.others = require("./routes/others.js");
Si no conoce los nombres de archivo, debe escribir algún tipo de cargador.
Ejemplo de trabajo de un cargador:
var normalizedPath = require("path").join(__dirname, "routes");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
require("./routes/" + file);
});
// Continue application logic here
Estoy usando módulos de nodo módulo de copia para crear un solo archivo que requiera todos los archivos en nuestro sistema basado en NodeJS.
El código para nuestro archivo de utilidad se ve así:
/**
* Module dependencies.
*/
var copy = require(''copy-to'');
copy(require(''./module1''))
.and(require(''./module2''))
.and(require(''./module3''))
.to(module.exports);
En todos los archivos, la mayoría de las funciones se escriben como exportaciones, así:
exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };
Entonces, para usar cualquier función de un archivo, simplemente llame:
var utility = require(''./utility'');
var response = utility.function2(); // or whatever the name of the function is
Otra opción es usar el paquete require-dir que le permite hacer lo siguiente. Es compatible con la recursión también.
var requireDir = require(''require-dir'');
var dir = requireDir(''./path/to/dir'');
Puede usar: https://www.npmjs.com/package/require-file-directory
- Requerir archivos seleccionados con nombre solamente o todos los archivos.
- No hay necesidad de un camino absoluto.
- Fácil de entender y usar.
Recomiendo usar glob para realizar esa tarea.
var glob = require( ''glob'' )
, path = require( ''path'' );
glob.sync( ''./routes/**/*.js'' ).forEach( function( file ) {
require( path.resolve( file ) );
});
Sé que esta pregunta tiene más de 5 años, y las respuestas dadas son buenas, pero quería algo un poco más potente para Express, así que creé el paquete express-map2
para npm. Iba a llamarlo simplemente express-map
, sin embargo, la gente de yahoo ya tiene un paquete con ese nombre, así que tuve que cambiar el nombre de mi paquete.
1. uso básico:
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.
});
uso del controlador:
//single function
module.exports = function(req,res){
};
//export an object with multiple functions.
module.exports = {
foo: function(req,res){
},
bar: function(req,res){
}
};
2. Uso avanzado, con prefijos:
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
});
Como puede ver, esto ahorra una tonelada de tiempo y hace que el enrutamiento de su aplicación sea sencillo de escribir, mantener y entender. admite todos los verbos http que expresan soportes, así como el método especial .all()
.
- paquete npm: https://www.npmjs.com/package/express-map2
- github repo: https://github.com/r3wt/express-map
Si incluye todos los archivos de * .js en el ejemplo de directorio ("app / lib / *. Js"):
En el directorio de aplicaciones / lib
example.js:
module.exports = function (example) { }
ejemplo-2.js:
module.exports = function (example2) { }
En el directorio de aplicaciones crear index.js
index.js:
module.exports = require(''./app/lib'');
Sobre la base de la solución de @ tbranyen, creo un archivo index.js
que carga javascripts arbitrarios en la carpeta actual como parte de las 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);
}
});
Entonces puede require
este directorio desde cualquier otro lugar.
Tengo una carpeta / campos llenos de archivos con una sola clase cada uno, por ejemplo:
fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class
Suelte esto en fields / index.js para exportar cada clase:
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);
Esto hace que los módulos actúen más como lo harían en Python:
var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
Un módulo que he estado usando para este caso de uso exacto es el require-all .
Requiere recursivamente todos los archivos en un directorio dado y sus subdirectorios siempre que no coincidan con la propiedad excludeDirs
.
También permite especificar un filtro de archivo y cómo obtener las claves del hash devuelto a partir de los nombres de archivo.
Una opción más es require-dir-all combina las características de los paquetes más populares.
La función require-dir
más popular no tiene opciones para filtrar los archivos / dirs y no tiene una función de map
(ver a continuación), pero utiliza un pequeño truco para encontrar la ruta actual del módulo.
En segundo lugar, el require-all
popularidad tiene require-all
filtros y preprocesamiento de __dirname
, pero carece de una ruta relativa, por lo que debe usar __dirname
(esto tiene pros y contras) como:
var libs = require(''require-all'')(__dirname + ''/lib'');
El require-index
mencionado aquí es bastante minimalista.
Con map
puede hacer un preprocesamiento, como crear objetos y pasar valores de configuración (asumiendo que los módulos se encuentran debajo de los constructores de exportaciones):
// 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`.