¿Cómo incluir manejadores de ruta en múltiples archivos en Express?

En mi aplicación express NodeJS tengo app.js que tiene algunas rutas comunes. Luego, en un archivo wf.js , me gustaría definir algunas rutas más.

¿Cómo puedo hacer que app.js reconozca otros manejadores de ruta definidos en el archivo wf.js ?

Un requisito simple no parece funcionar.

Si desea colocar las rutas en un archivo separado , por ejemplo routes.js , puede crear el archivo routes.js de esta manera:

 module.exports = function(app){ app.get('/login', function(req, res){ res.render('login', { title: 'Express Login' }); }); //other routes.. } 

Y luego puede app.js desde app.js pasando el objeto de la app de esta manera:

 require('./routes')(app); 

También eche un vistazo a estos ejemplos

https://github.com/visionmedia/express/tree/master/examples/route-separation

Sobre la base del ejemplo de @ShadowCloud, pude incluir dinámicamente todas las rutas en un subdirectorio.

routes / index.js

 var fs = require('fs'); module.exports = function(app){ fs.readdirSync(__dirname).forEach(function(file) { if (file == "index.js") return; var name = file.substr(0, file.indexOf('.')); require('./' + name)(app); }); } 

A continuación, coloca los archivos de ruta en el directorio de rutas de esta manera:

routes / test1.js

 module.exports = function(app){ app.get('/test1/', function(req, res){ //... }); //other routes.. } 

Repitiendo eso tantas veces como necesité y finalmente en app.js colocando

 require('./routes')(app); 

A pesar de que esta es una pregunta más antigua, me encontré aquí buscando una solución a un problema similar. Después de probar algunas de las soluciones aquí, terminé yendo en una dirección diferente y pensé que agregaría mi solución a cualquier persona que termine aquí.

En Express 4.x puede obtener una instancia del objeto enrutador e importar otro archivo que contenga más rutas. Incluso puede hacerlo de forma recursiva para que sus rutas importen otras rutas y le permita crear rutas de URL fáciles de mantener. Por ejemplo, si ya tengo un archivo de ruta separado para mi punto final ‘/ tests’ y deseo agregar un nuevo conjunto de rutas para ‘/ tests / automated’, es posible que desee romper estas rutas ‘/ automatizadas’ en otro archivo para mantener mi archivo ‘/ test’ pequeño y fácil de administrar. También le permite agrupar lógicamente rutas juntas por ruta de URL que puede ser realmente conveniente.

Contenido de ./app.js:

 var express = require('express'), app = express(); var testRoutes = require('./routes/tests'); // Import my test routes into the path '/test' app.use('/tests', testRoutes); 

Contenido de ./routes/tests.js

 var express = require('express'), router = express.Router(); var automatedRoutes = require('./testRoutes/automated'); router // Add a binding to handle '/test' .get('/', function(){ // render the /tests view }) // Import my automated routes into the path '/tests/automated' // This works because we're already within the '/tests' route so we're simply appending more routes to the '/tests' endpoint .use('/automated', automatedRoutes); module.exports = router; 

Contenido de ./routes/testRoutes/automated.js:

 var express = require('express'), router = express.Router(); router // Add a binding for '/tests/automated/' .get('/', function(){ // render the /tests/automated view }) module.exports = router; 

Y comstack aún más en la respuesta anterior, esta versión de routes / index.js ignorará cualquier archivo que no termine en .js (y sí mismo)

 var fs = require('fs'); module.exports = function(app) { fs.readdirSync(__dirname).forEach(function(file) { if (file === "index.js" || file.substr(file.lastIndexOf('.') + 1) !== 'js') return; var name = file.substr(0, file.indexOf('.')); require('./' + name)(app); }); } 

Enrutamiento recursivo completo de todos los archivos .js en la carpeta /routes , ponga esto en app.js

 // Initialize ALL routes including subfolders var fs = require('fs'); var path = require('path'); function recursiveRoutes(folderName) { fs.readdirSync(folderName).forEach(function(file) { var fullName = path.join(folderName, file); var stat = fs.lstatSync(fullName); if (stat.isDirectory()) { recursiveRoutes(fullName); } else if (file.toLowerCase().indexOf('.js')) { require('./' + fullName)(app); console.log("require('" + fullName + "')"); } }); } recursiveRoutes('routes'); // Initialize it 

en /routes pones whatevername.js e inicializas tus rutas de esta manera:

 module.exports = function(app) { app.get('/', function(req, res) { res.render('index', { title: 'index' }); }); app.get('/contactus', function(req, res) { res.render('contactus', { title: 'contactus' }); }); } 

Un ajuste a todas estas respuestas:

 var routes = fs.readdirSync('routes') .filter(function(v){ return (/.js$/).test(v); }); 

Simplemente use una expresión regular para filtrar mediante la prueba de cada archivo en la matriz. No es recursivo, pero filtrará las carpetas que no terminan en .js

Sé que esta es una vieja pregunta, pero estaba tratando de encontrar algo así para mí y este es el lugar donde terminé, así que quería poner mi solución a un problema similar en caso de que alguien más tenga los mismos problemas que yo ‘ m teniendo Hay un buen módulo de nodos llamado consign que hace muchas cosas del sistema de archivos que se ven aquí para usted (es decir, sin elementos readdirSync). Por ejemplo:

Tengo una aplicación de API relajante que estoy tratando de comstackr y quiero poner todas las solicitudes que van a ‘/ api / *’ para ser autenticadas y quiero almacenar todas mis rutas que van en la API en su propio directorio (llamémoslo ‘api’). En la parte principal de la aplicación:

 app.use('/api', [authenticationMiddlewareFunction], require('./routes/api')); 

Dentro del directorio de rutas, tengo un directorio llamado “api” y un archivo llamado api.js. En api.js, simplemente tengo:

 var express = require('express'); var router = express.Router(); var consign = require('consign'); // get all routes inside the api directory and attach them to the api router // all of these routes should be behind authorization consign({cwd: 'routes'}) .include('api') .into(router); module.exports = router; 

Todo funcionó como se esperaba. Espero que esto ayude a alguien.

Si desea un archivo .js separado para organizar mejor sus rutas, simplemente cree una variable en el archivo app.js que apunta a su ubicación en el sistema de archivos:

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

entonces,

 app.get('/wf', wf.foo ); 

donde .foo es alguna función declarada en su archivo wf.js p.ej

 // wf.js file exports.foo = function(req,res){ console.log(` request object is ${req}, response object is ${res} `); } 

Esta es posiblemente la pregunta / respuesta de desbordamiento de stack más asombrosa jamás realizada. Me encantan las soluciones de Sam / Brad anteriores. Pensé que entraría en la versión asíncrona que implementé:

 function loadRoutes(folder){ if (!folder){ folder = __dirname + '/routes/'; } fs.readdir(folder, function(err, files){ var l = files.length; for (var i = 0; i < l; i++){ var file = files[i]; fs.stat(file, function(err, stat){ if (stat && stat.isDirectory()){ loadRoutes(folder + '/' + file + '/'); } else { var dot = file.lastIndexOf('.'); if (file.substr(dot + 1) === 'js'){ var name = file.substr(0, dot); // I'm also passing argv here (from optimist) // so that I can easily enable debugging for all // routes. require(folder + name)(app, argv); } } }); } }); } 

Mi estructura de directorio es un poco diferente. Normalmente, defino rutas en app.js (en el directorio raíz del proyecto) require './routes' . En consecuencia, me estoy saltando el cheque contra index.js porque quiero incluir ese también.

EDITAR: También puede poner esto en una función y llamarlo recursivamente (he editado el ejemplo para mostrar esto) si desea anidar sus rutas en carpetas de profundidad arbitraria.

¡Escribí un pequeño complemento para hacer esto! se cansó de escribir el mismo código una y otra vez.

https://www.npmjs.com/package/js-file-req

Espero eso ayude.

Estoy tratando de actualizar esta respuesta con “express”: “^ 4.16.3”. Esta respuesta es similar a ShortRound1911.

server.js

 const express = require('express'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const db = require('./src/config/db'); const routes = require('./src/routes'); const port = 3001; const app = new express(); //...use body-parser app.use(bodyParser.urlencoded({ extended: true })); //...fire connection mongoose.connect(db.url, (err, database) => { if (err) return console.log(err); //...fire the routes app.use('/', routes); app.listen(port, () => { console.log('we are live on ' + port); }); });