Как включить обработчики маршрутов в несколько файлов в Express?
в моих NodeJS express приложение у меня есть app.js это имеет несколько общих маршрутов. Тогда в wf.js файл я хотел бы определить еще несколько маршрутов.
как я могу получить app.js распознавать другие обработчики маршрутов определена в ?
простой требуются не работает.
11 ответов:
если вы хотите поместите маршруты в отдельный файл, например
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, я смог динамически включить все маршруты в подкаталог.
маршруты индекса/.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); }); }затем размещение файлов маршрутов в каталоге маршрутов следующим образом:
маршруты/тест1.js
module.exports = function(app){ app.get('/test1/', function(req, res){ //... }); //other routes.. }повторяя это столько раз, сколько мне нужно, а затем, наконец, в приложение.js размещение
require('./routes')(app);
несмотря на то, что это более старый вопрос, я споткнулся здесь, ища решение аналогичной проблемы. После того, как я попробовал некоторые из решений здесь, я пошел в другом направлении и подумал, что добавлю свое решение для всех, кто окажется здесь.
в экспресс 4.x можно получить экземпляр объекта маршрутизатора и импортировать другой файл, содержащий больше маршрутов. Вы даже можете сделать это рекурсивно, чтобы ваши маршруты импортировали другие маршруты, позволяющие вам создавать простой в обслуживании url пути. Например, если у меня уже есть отдельный файл маршрута для моей конечной точки "/tests "и вы хотите добавить новый набор маршрутов для "/tests/automated", я могу разбить эти "/automated "маршруты на другой файл, чтобы сохранить мой файл "/test " маленьким и простым в управлении. Он также позволяет логически группировать маршруты вместе по URL-адресу, что может быть очень удобно.
содержание ./приложение.js:
var express = require('express'), app = express(); var testRoutes = require('./routes/tests'); // Import my test routes into the path '/test' app.use('/tests', testRoutes);содержание ./ маршруты / тесты.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;содержание ./маршрутов/testRoutes/автоматизированной.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;
и построить еще больше на предыдущем ответе, эта версия маршрутов / индекса.на 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файлы внутри и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' }); }); }
Я знаю, что это старый вопрос, но я пытался выяснить что-то вроде для себя, и это место, где я оказался, поэтому я хотел поставить свое решение аналогичной проблемы, если у кого-то еще есть те же проблемы, что и у меня. Там есть хороший модуль узла под названием отправить это делает много вещей файловой системы, которые видны здесь для вас (т. е. - нет материала readdirSync). Например:
у меня есть приложение restful API, которое я пытаюсь построить, и я хочу чтобы поместить все запросы, которые идут в "/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;все работало как ожидалось. Надеюсь, это кому-то поможет.
одна настройка на все эти ответы:
var routes = fs.readdirSync('routes') .filter(function(v){ return (/.js$/).test(v); });просто использовать регулярное выражение для фильтрации через тестирование каждого файла в массив. Он не является рекурсивным, но он будет отфильтровывать папки, которые не заканчиваются .js
если вы хотите отделить .JS файл для лучшей организации маршрутов, просто создайте переменную в
app.jsфайл, указывающий на его расположение в файловой системе:var wf = require(./routes/wf);затем,
app.get('/wf', wf.foo );здесь
.fooкакая-то функция объявлена в вашем . е.г// wf.js file exports.foo = function(req,res){ console.log(` request object is ${req}, response object is ${res} `); }
Я пытаюсь обновить этот ответ с помощью "express": "^4.16.3". Этот ответ похож на ShortRound1911.
сервер.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); }); });/ src / routes / index.js
const express = require('express'); const app = express(); const siswaRoute = require('./siswa_route'); app.get('/', (req, res) => { res.json({item: 'Welcome ini separated page...'}); }) .use('/siswa', siswaRoute); module.exports = app;/src / routes / siswa_route.js
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.json({item: 'Siswa page...'}); }); module.exports = app;Я надеюсь, что это может помочь кому-то. Счастливого кодирования!
это, возможно, самый удивительный вопрос переполнения стека/ответ(Ы) когда-либо. Я любовь решения Сэма/Брэда выше. Думал, что я буду перезванивать с асинхронной версией, которую я реализовал:
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); } } }); } }); }моя структура каталогов немного другая. Я обычно определяю маршруты в приложении.js (в корневом каталоге проекта) по
require- ing'./routes'. Следовательно, я пропускаю проверку противindex.jsпотому что хочу включить как что ж.изменить: Вы также можете поместить это в функцию и вызывать ее рекурсивно (я редактировал пример, чтобы показать это), если вы хотите вложить свои маршруты в папках произвольной глубины.
Я написал небольшой плагин для этого! надоело писать один и тот же код снова и снова.
https://www.npmjs.com/package/js-file-req
надеюсь, что это помогает.
Comments