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

    简介

    • 路由是网站或Web服务中最重要的一个方面;路由是将请求(由URL和HTTP方法指定)路由到处理它们的代码去的一种机制。
    • 路由过去是基于文件的,这很简单,但不灵活。

    IA

    • 是指内容的概念性组织。在考虑路由之前有一个可扩展(但不过于复杂的)IA会为后续工作提供巨大的好处。

    • 有些建议能帮你实现持久的IA。

      • 绝不在URL中暴露技术细节: 如经常看到看到URL以“.asp”结尾的网站;
      • 避免在URL中出现无意义的信息: 如根路由就是首页,不需要像/home/directions和/home/contact这样的URL。
      • 避免无谓的长URL: 在同等条件下,短的URL比长的URL好。然而不应该为了缩短URL牺牲清晰性,或者SEO。
      • 单词分隔符要保持一致: 用连字符分隔单词的情况十分常见,而用下划线的情况不太多。一般认为连字符比下划线更美观,并且大多数SEO专家都建议用连字符。
      • 绝不要用空格或不可录入的字符: 不要在URL中使用空格。它一般会被转换成加号(+);一定不要使用除字母、数字、破折号和下划线之外的任何字符。
      • 在URL中用小写字母

    路由和SEO

    • 如果想让网站是可发现的,那就要考虑SEO,以及URL会如何影响它。特别是如果某些关键字特别重要并且有意义,就考虑把它变成URL的一部分。

    • 另外,不要为了提高排名而往URL中塞关键字,这和良好的IA背道而驰,并且很可能会事与愿违。

    子域名

    • 除了路径,子域名一般也是URL中用来路由请求的部分。子域名最好保留给程序中显著不同的部分,比如REST API或管理界面

    • 用子域名分割内容时一般会影响SEO,所以一般应该留给SEO不重要的区域,比如管理区域和API; 并且只有在确实没有其他选择时,才给对于SEO方案来说比较重要的内容使用子域名。

    • Express中的路由机制默认不会把子域名考虑在内:app.get(/about) 会处理对 http://meadowlarktravel.com/abouthttp://www.meadowlarktravel.com/abouthttp://admin.meadowlarktravel.com/about 的请求。

    • 如果想分开处理子域名,可以用vhost包(表示“虚拟主机”,源自Apache的机制,一般用来处理子域名)。

      • 先安装这个包(npm install --save vhost),然后编辑应用程序文件创建一个子域名:
    // 创建子域名 "admin" ……它应该出现在所有其他路由之前
    var admin = express.Router(); 
    app.use(vhost('admin.*', admin));
    
    // 创建admin的路由;它们可以在任何地方定义
    admin.get('/', function(req, res){ 
      res.render('admin/home');
    });
    admin.get('/users', function(req, res){
      res.render('admin/users');
    });
    
    • express.Router()本质上是创建了一个新的Express路由器实例。
    • 可以像对待原始实例(app)那样对它:像对app那样给它添加路由和中间件。然而在将它添加到app上之前,它什么也不会做。
    • 我们通过vhost添加它,将那个路由器实例绑到那个子域名。

    路由处理器是中间件

    //这个例子中两次概率相同
    
    app.get('/foo', function(req,res,next){   //注意next
      if(Math.random() < 0.5) return next(); 
      res.send('sometimes this');
    });
    app.get('/foo', function(req,res){
      res.send('and sometimes that');
    });
    
    • 可以创建可以用在任何路由中的通用函数。比如说,我们有种机制在特定页面上显示特殊优惠。特殊优惠经常换,并且不是每个页面上都显示。我们可以创建一个函数,将specials注入到res.locals属性中
    function specials(req, res, next){
      res.locals.specials = getSpecialsFromDatabase(); 
      next();
    }
    app.get('/page-with-specials', specials, function(req,res){
        res.render('page-with-specials');
    });
    
    • 也可以用这种方式实现授权机制。比如说我们的用户授权代码会设定一个会话变量req.session.authorized,则可以像下面这样做一个可重复使用的授权过滤器:
    function authorize(req, res, next){ 
      if(req.session.authorized) return next(); 
      res.render('not-authorized');
    }
    app.get('/secret', authorize, function(){
      res.render('secret');
    })
    app.get('/sub-rosa', authorize, function(){ 
      res.render('sub-rosa');
    });
    

    路由路径和正则表达式

    • 路由中指定的路径(比如/foo)最终会被Express转换成一个正则表达式。某些正则表达式中的元字符可以用在路由路径中:+?*()
    //同一个路由处理/user和/username两个URL:
    app.get('/user(name)?', function(req,res){ 
      res.render('user');
    });
    
    //省略缩写
    app.get('/khaa+n', function(req,res){ 
      res.render('khaaan');
    });
    
    //多个选择
    
    app.get('/crazy|lunacy/', function(req,res){ 
      res.render('check');
    });
    
    • 并不是所有的常规正则表达式元字符在路由路径中都有含义; 因为一般在正则表达式中表示“任意字符”的句号点(.)可以不经转义用在路由中。

    路由参数

    • 在日常使用的Expression工具箱中可能很少发现正则路由,但路由参数很可能要经常用。
    • 这是一种把变量参数放到路由中成为其一部分的办法。
    var staff = {
      mitch: { bio: 'Mitch is the man to have at your back in a bar fight.' },
      madeline: { bio: 'Madeline is our Oregon expert.' },
      walt: { bio: 'Walt is our Oregon Coast expert.' },
    };
    
    app.get('/staff/:name', function(req, res){
      var info = staff[req.params.name];
      if(!info) return next();  // 最终将会落入 404 
      res.render('staffer', info);
    })
    
    //
    var staff = { 
      portland: {
        mitch: { bio: 'Mitch is the man to have at your back.' },
        madeline: { bio: 'Madeline is our Oregon expert.' },
      }, 
      bend: {
        walt: { bio: 'Walt is our Oregon Coast expert.' },
      }, 
    };
    
    app.get('/staff/:city/:name', function(req, res){
      var info = staff[req.params.city][req.params.name];
      if(!info) return next(); // 最终将会落入404
      res.render('staffer', info);
    });
    
  • 相关阅读:
    swift
    swift
    swift
    swift
    swift
    swift
    swift
    选择排序
    组合 和 继承
    Android中使用LitePal操控SQLite数据库
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4353431.html
Copyright © 2011-2022 走看看