Как экспортировать все маршруты в Экспресс? - PullRequest
7 голосов
/ 26 мая 2011

У меня есть приложение NodeJS Express, которое становится действительно большим только в одном файле (app.js).

Я хочу экспортировать все свои маршруты в один внешний файл, скажем, ./lib/routes.js. Как это сделать?

Как экспортировать следующий бит кода и правильно его ввести в main app.js?

app.get('/logout', function(req, res) {
    res.render('logout', {
        username: req.session.username
    });
});

app.get('/dashboard', function(req, res) {
    res.render('dashboard', {
        username: req.session.username
    });
});

app.get('/login', function(req, res) {
    res.render('login', {
        badLogin: false,
        loginError: false
    });
});

Ответы [ 3 ]

21 голосов
/ 26 мая 2011

Что я делаю, так это группирую свои маршруты по контроллеру. Для каждой группы связанных маршрутов (пользователи, корзина покупок и т. Д.) Я создаю файл контроллера, который находится в app/controllers/foo.js, где foo - имя контроллера. В моем главном файле javascript-сервера (где весь ваш код в настоящее время живет) я require каждый контроллер по имени, а затем вызываю его setup функцию, передавая мой экспресс-объект app, и позволяю контроллеру добавлять любые маршруты, по которым он необходимо.

['api', 'authorization', 'users', 'tests'].map(function(controllerName) {
    var controller = require('./controllers/' + controllerName);
    controller.setup(app);
 });

Внутри каждого контроллера я делаю что-то вроде:

exports.setup = function(app) {
    app.get('/dashboard', function(req, res) {
        res.render('dashboard', {
            username: req.session.username
        });
    });
};
7 голосов
/ 26 мая 2011

Почему бы не сделать что-то вроде этого:

// logout.js
module.exports = function(req, res){
  res.render('logout', {
    username: req.session.username
  });
});

// dashboard.js
module.exports = function(req, res){
  res.render('dashboard', {
    username: req.session.username
  });
});

// login.js
module.exports = function(req, res){
  res.render('login', {
    badLogin: false,
    loginError: false
  });
});

// app.js
app.get('/logout', require('logout'));
app.get('/dashboard', require('dashboard'));
app.get('/login', require('login'));

Кроме того, вы можете легко представить себе использование http://nodejs.org/docs/v0.4.8/api/fs.html#fs.readdir для циклического просмотра каталога маршрутов и программной загрузки.

Вы могли бы даже сделать что-то вроде ...

module.exports.handler[] = {
    method : 'get',
    route  : '/login',
    action : res.render('login', {
       badLogin: false,
       loginError: false
    });
}

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

0 голосов
/ 28 мая 2019

используя glob, вы можете экспортировать все маршруты в каталоге, например, '/ route':

нпм я - сохранить глобус


    // *** /routes/index.js file ***

    const express = require('express')
    const Router = express.Router
    const router = Router()
    const glob = require('glob')


    /**
     * options ignore files inside routes folder
     */
    const options = {
        ignore: [`${__dirname}/_helpers.js`, `${__dirname}/index.js`]
    }

    /**
     * read all files on current directory and export routes as lowercase of the filename
     * example 'routes/Products.js' route will be access by '/products'
     */
    const routes = 
        glob.sync(__dirname + '/*.js', options)
            .map(filename => {
                const arr = filename.split('/')
                let name = arr.pop();
                name = name.replace('.js', '')
                return {
                    path: `/${name.toLowerCase()}`,
                    router: require(`${filename.replace('.js', '')}`)
                }
            })
            .filter(obj => Object.getPrototypeOf(obj.router) == Router)
            .forEach(obj => router.use(obj.path, obj.router))


    module.exports = router;

тогда

в app.js

// app.js file

const express = require('express')
const routes = require('./routes')


const app = express()

app.use('/api', routes)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...