How to export all routes in Express?

前端 未结 3 1447
南方客
南方客 2021-02-02 03:52

I have an NodeJS Express app that is getting really big in just one file (app.js).

I want to export all my routes into a single, external file, say ./lib/routes.j

相关标签:
3条回答
  • 2021-02-02 04:07

    Why not do something like this:

    // 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'));
    

    Also, you could imagine easily using http://nodejs.org/docs/v0.4.8/api/fs.html#fs.readdir to loop through a routes directory and load these up programmatically.

    You could even do something along the lines of...

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

    Though I think I'd spend a little time thinking about how to simplify that.

    0 讨论(0)
  • 2021-02-02 04:10

    What I do is group my routes by controller. For each group of related routes (users, shopping cart, whatever), I make a controller file that lives in app/controllers/foo.js where foo is the controller name. In my main javascript server file (where all your code currently lives), I require each controller by name and then call its setup function, passing in my express app object, and allow the controller to add whatever routes it needs.

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

    Inside each controller, I do something like:

    exports.setup = function(app) {
        app.get('/dashboard', function(req, res) {
            res.render('dashboard', {
                username: req.session.username
            });
        });
    };
    
    0 讨论(0)
  • 2021-02-02 04:25

    using glob you can export all routes on directory for example '/routes':

    npm i --save glob

    
        // *** /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;
    

    then

    on app.js

    // app.js file
    
    const express = require('express')
    const routes = require('./routes')
    
    
    const app = express()
    
    app.use('/api', routes)
    
    
    0 讨论(0)
提交回复
热议问题