Come includere i gestori di percorsi in più file in Express?

Nella mia applicazione express NodeJS ho app.js che ha alcune rotte comuni. Quindi in un file wf.js vorrei definire alcuni altri percorsi.

Come posso ottenere app.js per riconoscere altri gestori di route definiti nel file wf.js ?

Un semplice requisito non sembra funzionare.

Se vuoi inserire le rotte in un file separato , ad esempio routes.js , puoi creare il file routes.js in questo modo:

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

E quindi puoi richiederlo da app.js passando l’ object app in questo modo:

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

Dai anche un’occhiata a questi esempi

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

Basandosi sull’esempio di @ShadowCloud, sono stato in grado di includere dynamicmente tutte le rotte in una sottodirectory.

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

Quindi posiziona i file di percorso nella directory dei percorsi in questo modo:

Percorsi / test1.js

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

Ripetendolo per tutte le volte che mi serviva e poi finalmente nel posizionamento di app.js

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

Anche se questa è una domanda più antica, sono incappata in questa ricerca di una soluzione a un problema simile. Dopo aver provato alcune delle soluzioni qui ho finito per andare in una direzione diversa e ho pensato di aggiungere la mia soluzione per chiunque altro finisse qui.

In 4.x express è ansible ottenere un’istanza dell’object router e importare un altro file che contiene più percorsi. Puoi anche farlo in modo ricorsivo in modo che i tuoi percorsi importino altri percorsi che ti consentano di creare percorsi di url facili da mantenere. Ad esempio, se ho già un file di percorso separato per il mio endpoint ‘/ tests’ e voglio aggiungere una nuova serie di percorsi per ‘/ test / automatizzati’, potrei voler interrompere questi percorsi ‘/ automatizzati’ in un altro file per mantenere il mio file ‘/ test’ piccolo e facile da gestire. Ti consente anche di raggruppare logicamente i percorsi insieme per il percorso dell’URL che può essere davvero conveniente.

Contenuti di ./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); 

Contenuti di ./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; 

Contenuti di ./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; 

E costruisci ancora di più sulla risposta precedente, questa versione di routes / index.js ignorerà tutti i file che non terminano in .js (e se stesso)

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

app.js completo ricorsivo di tutti i file .js all’interno della cartella /routes , inserire questo in 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 

in /routes metti whatevername.js e inizializza i tuoi percorsi in questo modo:

 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 tweak a tutte queste risposte:

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

Basta usare un’espressione regolare per filtrare testando ogni file nell’array. Non è ricorsivo, ma filtra le cartelle che non terminano in .js

So che questa è una vecchia domanda, ma stavo cercando di capire qualcosa di simile per me stesso e questo è il posto in cui sono finito, quindi volevo mettere la mia soluzione a un problema simile nel caso in cui qualcun altro avesse gli stessi problemi avendo C’è un bel modulo di nodo là fuori chiamato consign che fa un sacco di roba sul file system che è visto qui per te (cioè – nessuna roba readdirSync). Per esempio:

Ho una applicazione API riposante che sto cercando di build e voglio mettere tutte le richieste che vanno su ‘/ api / *’ per essere autenticate e voglio memorizzare tutti i miei percorsi che vanno in api nella loro directory (chiamiamolo ‘api’). Nella parte principale dell’app:

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

All’interno della directory dei percorsi, ho una directory chiamata “api” e un file chiamato api.js. In api.js, ho semplicemente:

 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; 

Tutto ha funzionato come previsto. Spero che questo aiuti qualcuno.

Se desideri un file .js separato per organizzare al meglio i tuoi percorsi, crea una variabile nel file app.js puntando alla sua posizione nel filesystem:

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

poi,

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

dove .foo è una funzione dichiarata nel tuo file wf.js per esempio

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

Questa è probabilmente la più stupefacente domanda / risposta di stack overflow di sempre. Adoro le soluzioni di Sam / Brad sopra. Ho pensato di inserire la versione asincrona che ho implementato:

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

La mia struttura di directory è leggermente diversa. Di solito definisco percorsi in app.js (nella directory root del progetto) require -ing './routes' . Di conseguenza, sto saltando il controllo su index.js perché voglio includerlo anche io.

EDIT: puoi anche metterlo in una funzione e chiamarla in modo ricorsivo (ho modificato l'esempio per mostrarlo) se vuoi annidare i tuoi percorsi in cartelle di profondità arbitraria.

Ho scritto un piccolo plugin per farlo! si è stancato di scrivere lo stesso codice più e più volte.

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

Spero che sia d’aiuto.

Sto cercando di aggiornare questa risposta con “express”: “^ 4.16.3”. Questa risposta è simile 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); }); });