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/about、http://www.meadowlarktravel.com/about和http://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);
});
express-18 路由的更多相关文章
- Express的路由详解
Express的路由详解 http://www.jb51.net/article/76203.htm
- express 的路由学习
使用步骤 - :获取路由中间件对象 `let router = express.Router();` - :配置路由规则 `router.请求方式(URL,fn事)` - fn中参数有req,res, ...
- 类似express的路由封装方式
1.原理 主要过程涉及三个元素的定义,如下: //用于承载一系列方法的对象 var funObj = {}; //用于根据条件执行funObj中的方法 var app = function(){}; ...
- express框架路由配置及congtroller自动加载
express框架在node官方推荐的一个框架,关于如何入门的文章,已经很多了,我就不在累赘了,本文的核心是如何修改文件使得更接近一个MVC的框架 express原生是通过require的方式实现了模 ...
- 【Express】路由
var express = require('express'); var app = express(); app.set('port', process.env.PORT || 3000); ap ...
- node.js零基础详细教程(5):express 、 路由
第五章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- Express全系列教程之(二):Express的路由以及动态路由
一.Express路由简介 路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式.它包含一个请求方时(methods).路径(path)和路由匹配时的函数(callback); app.m ...
- Express 体验 路由、模板引擎、中间件
http://expressjs.com/en/4x/api.html#req.method http://expressjs.com/en/guide/routing.html [Route pat ...
- NodeJS之express的路由浅析
路由路径和请求方法一起定义了请求的端点,它可以是字符串.字符串模式或者正则表达式.后端在获取路由后,可通过一系列类似中间件的函数去执行事务. 可使用字符串的路由路径: // 匹配根路径的请求 app. ...
随机推荐
- eclipse修改jdk后版本冲突问题
将安装的jdk1.8改为1.7之后出现了很淡疼的问题 修改工程下.setting/ org.eclipse.jdt.core.prefs eclipse.preferences.version=1or ...
- 【hadoop2.6.0】利用JAVA API 实现数据上传
原本的目的是想模拟一个流的上传过程,就是一边生成数据,一边存储数据,因为能用上HADOOP通常情况下原本数据的大小就大到本地硬盘存不下.这一般是通过把数据先一部分一部分的缓冲到本地的某个文件夹下,hd ...
- 【数据结构】book3_3 表达式求值
#include<iostream> #include <stdlib.h> using namespace std; typedef int Status; ; ; ; ; ...
- mysql无法启动
当在安装mysql服务时,有时会遇到恶心的PID错误而导致安装后无法启动以下为针对mysql-5.5版本在安装mysql时所遇到的问题的解决方法. 1.可能是/usr/local/mysql/data ...
- java获取客服端信息(系统,浏览器等)
String agent = request.getHeader("user-agent"); System.out.println(agent); StringTokenizer ...
- ios电话/密码/验证码/身份证的正则表达式
// 一 .电话号码正则表达式 -(BOOL)testPhoneNumber:(NSString *)text { NSString *regex =@"(13[0-9]|0[1-9]|0[ ...
- October 3rd 2016 Week 41st Monday
Better to light one candle than to curse the darkness. 与其诅咒黑暗,不如燃起蜡烛. Sitting in the darkness and wa ...
- Stanford大学机器学习公开课(三):局部加权回归、最小二乘的概率解释、逻辑回归、感知器算法
(一)局部加权回归 通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting).如下图的左图.而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕,因为 ...
- c语言if语句
#include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>int ...
- XMPP框架下微信项目总结(6)刷新好友列表(删除,添加好友)
原理:1 服务器(openfire)添加/删除 好友,会向客户端(app)发送消息, 2 代理(xmppStreamDelegate)监听到添加/删除消息后,花名册模块(RosterModule)会在 ...