Как включить обработчики маршрута в несколько файлов в Express?
В моем express
приложении NodeJS у меня есть app.js
который имеет несколько общих маршрутов. Затем в файле wf.js
я хотел бы определить еще несколько маршрутов.
Как я могу заставить app.js
распознавать другие обработчики маршрутов, определенные в файле wf.js
?
Простое требование , похоже, не работает.
- ошибка получения: «Ошибка: ошибка SSL: SELF_SIGNED_CERT_IN_CHAIN» при использовании npm
- Обновление Mongoose без обратного вызова
- Использование npm за корпоративным прокси .pac
- connect ECONNREFUSED - узел js, sql
- Есть ли способ сделать npm install (команда) работать за прокси?
- абсолютный путь res.sendFile
- Node.js - Использование async lib - async.foreach с объектом
- JWT (JSON Web Token) автоматическое продление срока действия
- Node.js подключается только к localhost
- Узел: войдите в файл вместо консоли
- Как использовать глобальную переменную в node.js?
- Как получить обратный вызов для MongoDB collection.find ()
- Как я могу построить свой тестовый пакет асинхронно?
Если вы хотите поместить маршруты в отдельный файл , например 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); }); });