【问题标题】:How to export all routes in Express?如何导出Express中的所有路线?
【发布时间】:2011-05-26 14:40:31
【问题描述】:

我有一个 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
    });
});

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我所做的是按控制器对我的路线进行分组。对于每组相关路由(用户、购物车等),我创建了一个位于app/controllers/foo.js 中的控制器文件,其中foo 是控制器名称。在我的主要 javascript 服务器文件(您的所有代码当前所在的位置)中,我按名称 require 每个控制器,然后调用其 setup 函数,传入我的 express 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
            });
        });
    };
    

    【讨论】:

    • 谢谢。在两个模块之间传递变量是否有简单的解决方案?
    • oooh,我喜欢传入的字符串作为参数变得多么干净,我之前没有考虑过那个......当然,你可以解析所有控制器所在的目录使用一个 fs 对象,并且很快就能把它们全部放在那里,是吗?
    • 是的,您也可以将它们全部加载到目录中。在我的情况下,我需要确保它们以正确的顺序加载,所以我明确指定它,但如果你的所有控制器都是独立的,那么你可以列出目录并全部加载。
    • 刚从 Node 开始,就遇到了这个答案。真的很喜欢这种方法,将路由声明从 app.js 移到它们所属的“控制器”中。干得好。
    【解决方案2】:

    为什么不这样做:

    // 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 循环遍历 routes 目录并以编程方式加载它们。

    你甚至可以做一些类似...的事情

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

    虽然我想我会花一点时间考虑如何简化它。

    【讨论】:

      【解决方案3】:

      使用 glob,您可以导出目录中的所有路由,例如 '/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;
      

      然后

      在 app.js 上

      // app.js file
      
      const express = require('express')
      const routes = require('./routes')
      
      
      const app = express()
      
      app.use('/api', routes)
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2021-01-31
        • 1970-01-01
        相关资源
        最近更新 更多