Как включить обработчики маршрута в несколько файлов в Express?

В моем express приложении NodeJS у меня есть app.js который имеет несколько общих маршрутов. Затем в файле wf.js я хотел бы определить еще несколько маршрутов.

Как я могу заставить app.js распознавать другие обработчики маршрутов, определенные в файле wf.js ?

Простое требование , похоже, не работает.

Если вы хотите поместить маршруты в отдельный файл , например routes.js , вы можете создать файл routes.js следующим образом:

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

И тогда вы можете потребовать его от app.js передающего объект app таким образом:

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

Посмотрите также на эти примеры.

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

Основываясь на примере @ShadowCloud, я смог динамически включать все маршруты в подкаталог.

маршруты / 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); }); } 

Затем размещение файлов маршрутов в каталоге маршрутов следующим образом:

маршруты / test1.js

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

Повторяя это столько раз, сколько мне нужно, а затем, наконец, в приложении app.js

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

Даже несмотря на то, что этот старый вопрос я наткнулся на поиск решения аналогичной проблемы. Попробовав некоторые из решений здесь, я оказался в другом направлении и думал, что добавлю свое решение для всех, кто попадает сюда.

В express 4.x вы можете получить экземпляр объекта маршрутизатора и импортировать другой файл, содержащий больше маршрутов. Вы можете даже сделать это рекурсивно, чтобы ваши маршруты импортировали другие маршруты, позволяя вам создавать простые в обслуживании URL-адреса. Например, если у меня есть отдельный файл маршрута для конечной точки «/ tests» уже и вы хотите добавить новый набор маршрутов для «/ tests / automatic», я могу разбить эти «автоматические» маршруты на другой файл, чтобы сохранить мой файл «/ test» небольшим и простым в управлении. Он также позволяет логически группировать маршруты вместе по URL-адресу, который может быть действительно удобным.

Содержание ./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); 

Содержание ./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; 

Содержание ./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; 

И построим еще больше на предыдущем ответе, эта версия маршрутов / index.js будет игнорировать любые файлы, не заканчивающиеся на .js (и сам)

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

Полностью рекурсивная маршрутизация всех файлов .js внутри /routes , поместите это в 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 

в /routes вы помещаете whatevername.js и инициализируете свои маршруты следующим образом:

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

Одна настройка для всех этих ответов:

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

Просто используйте регулярное выражение для фильтрации через тестирование каждого файла в массиве. Он не рекурсивный, но он будет отфильтровывать папки, которые не заканчиваются на .js

Я знаю, что это старый вопрос, но я пытался выяснить что-то вроде себя, и это то место, в котором я оказался, поэтому я хотел поставить свое решение на аналогичную проблему, если у кого-то есть те же проблемы, м. Там есть хороший модуль узла, называемый consign, который делает много файлов файловой системы, которые видны здесь для вас (т. Е. – нет материала readdirSync). Например:

У меня есть приложение для поддержки приложений, которое я пытаюсь создать, и я хочу, чтобы все запросы, которые попадают в ‘/ api / *’, были аутентифицированы, и я хочу сохранить все мои маршруты, которые входят в api в свой собственный каталог (давайте просто назовем его «api»). В основной части приложения:

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

Внутри каталога маршрутов у меня есть каталог под названием api и файл api.js. В api.js я просто имею:

 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; 

Все работало, как ожидалось. Надеюсь, это поможет кому-то.

Если вы хотите, чтобы отдельный .js-файл лучше организовывал ваши маршруты, просто создайте переменную в файле app.js указывая на ее расположение в файловой системе:

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

тогда,

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

где .foo – некоторая функция, объявленная в вашем файле wf.js например

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

Это, возможно, самый удивительный вопрос / вопрос о переполнении стека. Я обожаю решения Сэма / Брэда выше. Думал, что я перезвоню с асинхронной версией, которую я реализовал:

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

Моя структура каталогов немного отличается. Обычно я определяю маршруты в app.js (в корневой директории проекта), require './routes' . Следовательно, я пропускаю чек против index.js потому что я хочу включить его также.

EDIT: вы также можете поместить это в функцию и вызывать ее рекурсивно (я отредактировал пример, чтобы показать это), если вы хотите вложить свои маршруты в папки произвольной глубины.

Я написал небольшой плагин для этого! устали писать один и тот же код снова и снова.

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

Надеюсь, поможет.

Я пытаюсь обновить этот ответ «express»: «^ 4.16.3». Этот ответ аналогичен 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); }); }); 
  • Promise.all потребляет всю мою RAM
  • Можно ли динамически вернуть сертификат SSL в NodeJS?
  • Mongoose Уникальный индекс не работает!
  • (узел: 3341) Устаревание Предупреждение: Mongoose: mpromise
  • Загрузите модуль node.js из строки в памяти
  • С трудом пытаться понять «next / next ()» в express.js
  • Объединение соединений node.js + mysql
  • Заменить строку в файле с помощью nodejs
  • Есть ли библиотека планировщика заданий для node.js?
  • Mongoose findByIdAndUpdate не возвращает правильную модель
  • Как использовать socket.io в express-маршрутах?
  • Давайте будем гением компьютера.