• 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的文档。

  • 相关阅读:
    struts2 之 Action的创建方式
    struts2 之 struts2数据处理
    SuperMap for WebGL 9D 加载平面坐标系三维场景
    SuperMap-WebGL-坐标系及转换说明
    SuperMap -WebGL 实现地球的背景透明并显示自定义图片
    转载: ssh连接上华为云Linux服务器,一会就自动断开
    Arcgis瓦片--js客户端加载
    Arcgis瓦片--数据获取
    转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
    转载-浏览器优化中的2-5-8原则
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4353861.html
Copyright © 2020-2023  润新知