zoukankan      html  css  js  c++  java
  • express-19 路由2

    组织路由

    • 在主应用程序文件中定义所有路由太笨重了。那样不仅会导致那个文件一直增长,还不利于功能的分离,因为那个文件里已经有很多东西了。

    • 四条组织路由的指导原则

      • 给路由处理器用命名函数: 到目前为止,我们都是在行内写路由处理器的,实际上就是马上在那里定义处理路由的函数。这对于小程序或原型来说没问题,但随着网站的增长,这种方式很快就会变得过于笨重。
      • 路由不应该神秘: 一种极端的做法是简单地把网站的所有路由都放到一个文件中,好知道它们在哪。对于大型网站来说,可能不想这样,那就根据功能区域把路由分开;然而,即便如此,也应该清楚该到哪里找给定的路由。
      • 路由组织应该是可扩展的:
      • 不要忽视自动化的基于视图的路由处理器: 如果网站由很多静态和固定URL的页面组成,所有路由最终看起来将像是:app.get('/static/thing', function(req, res){ res.render('static/thing'); }。要减少不必要的重复代码,可以考虑使用自动化的基于视图的路由处理器。

    在模块中声明路由

    • 组织路由的第一步是把它们都放到它们自己的模块中。
      • 一种方式是将你的模块做成一个函数,让它返回包含“方法”和“处理器”属性的对象数组。然后可以这样在应用程序文件中定义路由:
    var routes = require('./routes.js')(); 
    routes.forEach(function(route){
      app[route.method](route.handler);
    })
    
    • 这种方式有它的优势,并且可能非常适合动态地存储路由,比如在数据库或JSON文件中。然而,如果不需要那样的功能,建议将app实例传给模块,然后让它添加路由。
    //routes.js
    module.exports = function(app){ 
    
      app.get('/', function(req,res){
        app.render('home');
      }))
    
      //...
    
    };
    
    //连入路由,在meadowlark.js中直接引入路由:
    require('./routes.js')(app);
    

    按逻辑对处理器分组

    • 要满足第一条指导原则(给路由处理器用命名函数),需要找地方放那些处理器。更极端的做法是给每个处理器建一个JavaScript文件。很难想象这种方式在哪种场景下会带来好处。

    • 以某种方式将相关功能分组更好。那样不仅更容易利用共享的功能,并且更容易修改相关的方法。

    • 先把功能分组到各自的文件中:handlers/main.js中放首页处理器、/about处理器,以及所有不属于任何其他逻辑分组的处理器,handlers/vacations.js中放跟度假相关的处理器,以此类推。

    //handlers/main.js:
    
    var fortune = require('../lib/fortune.js');
    
    exports.home = function(req, res){ 
      res.render('home');
    };
    
    exports.about = function(req, res){ 
      res.render('about', {
          fortune: fortune.getFortune(),
          pageTestScript: '/qa/tests-about.js'
      } );
    };
    
    //...
    
    //接下来修改routes.js以使用它:
    
    var main = require('./handlers/main.js');
    
    module.exports = function(app){
    
      app.get('/', main.home); 
      app.get('/about', main.about); 
      //...
    
    };
    
    
    • 如果routes.js变得笨重了,我们可以再用相同的技术,把app传给另一个模块,再注册更多路由

    自动化渲染视图

    • 如果你的网站有很多内容,但功能不多,你可能发现给每个视图添加一个路由是不必要的麻烦。
    var autoViews = {};
    var fs = require('fs');
    
    app.use(function(req,res,next){
      var path = req.path.toLowerCase();
      // 检查缓存;如果它在那里,渲染这个视图
      if(autoViews[path]) return res.render(autoViews[path]);
      // 如果它不在缓存里,那就看看有没有.handlebars文件能匹配
      if(fs.existsSync(__dirname + '/views' + path + '.handlebars')){
          autoViews[path] = path.replace(/^//, '');
          return res.render(autoViews[path]); 
      }
      // 没发现视图;转到404处理器
      next(); 
    });
    
    • 注意,常规路由会避开这一机制(因为我们把自动视图处理器放在了其他所有路由后面),所以如果你有个路由为/foo渲染了不同的视图,那它会取得优先权。

    其他的路由组织方式

    • 最流行的两种路由组织方式是命名空间路由和随机应变路由。
      • 当很多路由都以相同的前缀开始时,命名空间路由很不错(比如/vacations)。有个Node模块叫express-namespace,它让这种方式变得很容易。
      • 随机应变路由基于一个对象中的方法自动添加路由。如果网站的逻辑是天然面向对象的,这项技术就很好用。express-resource包是如何实现这种路由组织风格的范例。

    路由在项目中很重要,如果我在本章中介绍的基于模块的路由技术看起来不适合你,我建议你看看express-namespace或express-resource的文档。

  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4353861.html
Copyright © 2011-2022 走看看