Como include manipuladores de rota em vários arquivos no Express?

No meu aplicativo express NodeJS, tenho o app.js que possui algumas rotas comuns. Então, em um arquivo wf.js , gostaria de definir mais algumas rotas.

Como posso obter o app.js para reconhecer outros manipuladores de rota definidos no arquivo wf.js ?

Um simples requer não parece funcionar.

Se você quiser colocar as rotas em um arquivo separado , por exemplo, routes.js , você pode criar o arquivo routes.js desta maneira:

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

E então você pode exigir isso do app.js passando o object do app desta forma:

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

Veja também estes exemplos

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

Com base no exemplo do @ShadowCloud, pude include dinamicamente todas as rotas em um subdiretório.

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

Em seguida, colocar os arquivos de rota no diretório de rotas da seguinte forma:

routes / test1.js

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

Repetindo isso por quantas vezes eu precisasse e, finalmente, em app.js colocando

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

Mesmo que esta uma pergunta mais antiga, eu tropecei aqui procurando uma solução para um problema semelhante. Depois de experimentar algumas das soluções aqui, acabei indo em uma direção diferente e pensei em adicionar minha solução para qualquer outra pessoa que acabasse aqui.

No Express 4.x você pode obter uma instância do object roteador e importar outro arquivo que contenha mais rotas. Você pode até fazer isso de forma recursiva para que suas rotas importem outras rotas, permitindo que você crie caminhos de URL fáceis de manter. Por exemplo, se eu já tiver um arquivo de rota separado para o meu terminal ‘/ tests’ e quiser adicionar um novo conjunto de rotas para ‘/ tests / automated’, talvez eu queira dividir essas rotas ‘/ automatizadas’ em outro arquivo para manter meu arquivo ‘/ test’ pequeno e fácil de gerenciar. Também permite agrupar logicamente rotas por caminho de URL, o que pode ser realmente conveniente.

Conteúdo 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); 

Conteúdo 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; 

Conteúdo 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; 

E construa ainda mais sobre a resposta anterior, esta versão de routes / index.js irá ignorar qualquer arquivo que não termine em .js (e em si)

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

Roteamento recursivo completo de todos os arquivos .js dentro da pasta /routes , coloque isso em 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 

em /routes você coloca whatevername.js e inicializa suas rotas assim:

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

Um ajuste para todas estas respostas:

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

Basta usar um regex para filtrar por meio do teste de cada arquivo no array. Não é recursivo, mas filtrará as pastas que não terminarem em .js

Eu sei que esta é uma questão antiga, mas eu estava tentando descobrir algo como para mim e este é o lugar que acabei, então eu queria colocar a minha solução para um problema semelhante no caso de alguém tem os mesmos problemas que eu estou tendo. Há um bom módulo de nó lá fora, chamado consign, que faz muito do material do sistema de arquivos que é visto aqui para você (isto é, sem material readdirSync). Por exemplo:

Eu tenho um aplicativo de API sossegado que estou tentando construir e quero colocar todas as solicitações que vão para ‘/ api / *’ para serem autenticadas e quero armazenar todas as minhas rotas que entram na API em seu próprio diretório (vamos chamá-lo de ‘api’). Na parte principal do aplicativo:

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

Dentro do diretório de rotas, eu tenho um diretório chamado “api” e um arquivo chamado api.js. Em api.js, simplesmente tenho:

 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; 

Tudo funcionou como esperado. Espero que isso ajude alguém.

Se você quiser um arquivo .js separado para organizar melhor suas rotas, basta criar uma variável no arquivo app.js apontando para sua localização no sistema de arquivos:

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

então,

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

onde .foo é alguma function declarada no seu arquivo wf.js por exemplo

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

Esta é possivelmente a pergunta / resposta (s) de estouro de pilha mais impressionante de todos os tempos. Eu amo as soluções de Sam / Brad acima. Pensei em entrar em sintonia com a versão assíncrona que eu implementei:

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

Minha estrutura de diretórios é um pouco diferente. Eu normalmente defino rotas em app.js (no diretório raiz do projeto) require './routes' . Consequentemente, estou pulando a verificação contra o index.js porque também quero incluí-la.

EDIT: Você também pode colocar isso em uma function e chamá-lo recursivamente (eu editei o exemplo para mostrar isso) se você deseja aninhar suas rotas em pastas de profundidade arbitrária.

Eu escrevi um pequeno plugin para fazer isso! ficou doente de escrever o mesmo código várias vezes.

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

Espero que ajude.

Eu estou tentando atualizar esta resposta com “express”: “^ 4.16.3”. Essa resposta é semelhante à 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); }); });