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



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



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



простой требуются не работает.

696   11  

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

    Ничего не найдено.