Как в nodejs объединять роуты?

Начал изучать Node.js и стало интересно, как можно объединять роуты в Node? Сейчас я объясню, что подразумеваю:

Роуты приложения выглядит примерно так:
var controllers = require('./controllers'),
    myApp = require('../app'),
    admin = require('../admin');

// Основной роутер
module.exports = function (app) {

    // Отдаем сайт
    app.get('/', myApp.run);

    // Отдаем админ-панель
    app.get('/admin', admin.run);

    // RESTful controllers
    controllers(app);

    // Если нет обработчиков, 404
    app.get('*', function (req, res) {
        res.status(404).send("<h1>Page Not found</h1>");
    });
};


Тут интересен нам только controllers(app);
Он выглядит следующим образом:

var navigation = require('./navigation'),
    page = require('./page'),
    publication = require('./publication'),
    setting = require('./setting'),
    user = require('./user');

module.exports = function (app) {

    // Navigation controller routes
    navigation(app);

    // Page controller routes
    page(app);

    // Publication controller routes
    publication(app);

    // Setting controller routes
    setting(app);

    // User controller routes
    user(app);

};


Где каждый контроллер обрабатывает примерно такие роуты:
var page = require('../../controllers/page');

module.exports = function (app) {
    app.get('/api/page', function (req, res) {
        res.send(page.page());
    });
};


Т.е все запросы идут через url /api/"контроллер"/"метод"
Вот теперь вопрос, можно ли как нибудь сделать так, что бы в корневом роутере можно было как нибудь определять что url такого типа /api/* если так, то вызывать роутер контроллеров.
Мне кажется, если запросы не к api, то зачем node'e проходится по промежуточным обработчикам контроллеров? или это экономия на спичках(так как node не запустит промежуточный обработчик в случае не соответствия url)?
  • Вопрос задан
  • 887 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Volde
const apiRouter = require('./api/api');
app.use('/api', apiRouter());

api.js содержащий роуты
const express = require('express');
const router = new express.Router();
const users = require('../../controllers/users');
const pages= require('../../controllers/pages');

module.exports = () => router
  .get('/pages', pages.getPages)
  .get('/user', users.getUsers);
Ответ написан
Комментировать
flashbag
@flashbag
Програмист, социопат.
server.js
var routes  = require('./routes/');
var server = express();
routes(server);


routes/index.js
var fs = require("fs");
var path = require("path");

module.exports = function (server) {

  fs.readdirSync(path.resolve(__dirname)).forEach(function (file) {
    if (file.substr(-3, 3) === '.js' && file !== 'index.js') {
      var full_path = path.resolve(__dirname) + '/' + file.replace('.js', '');
      // console.log(full_path);
      require(full_path)(server);
    }
  });

};


routes/test.js
var testController = require('../controllers/test');

module.exports = function(server) {

  server.get('/test', testController.test);

};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы