1.路由的定义
路由是指如何定义的端点,以及如何响应客户端的请求。
路由决定了由谁(指定脚本)去响应客户端请求。
在HTTP请求中,我们可以通过路由,提取出请求的URL以及GET/POST参数。
2.路由例子
const express = require('express');//引入express
const app = express();//实例化express对象
//这是一个挂载到app上的路由
app.get("/",(req,res)=>{
res.send("hello world");
});
3.路由的结构
路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄(handle)组成,
它的结构如下: app.METHOD(path, [callback…], callback),
其中,
app 是 express 对象的一个实例,
METHOD 是一个 HTTP 请求方法,
path 是服务器上的路径,
callback 是当路由匹配时要执行的函数。
4.路由的路径
路由路径和请求方法一起定义了请求的端点,
它可以是字符串,字符串模式或者正则表达式
4.1.字符串
app.get("/login", function(req, res) {
res.send(`<html><h1>hello world</h1></html>`);
});
4.2.字符串模式
使用字符串模式的路由路径:
app.get("/ab?cd", function(req, res) { //表示字符b是可选的,也就是可以匹配到acd和abcd
res.send(`<html><h1>hello world</h1></html>`);
});
结果:
http://127.0.0.1:8081/abcd
和http://127.0.0.1:8081/abcd
都可以正常显示hello world
同理,还有
//1.问号:问号之前那个字符是可选的
app.get('/ab?cd', function(req, res) {}// 匹配 acd 和 abcd
//2.冒号:只要冒号之前的内容满足就行,冒号之后匹配任意内容
app.get('/ab/:id', function(req, res) {}// 匹配 /ab/******
//3.加号:加号之前的那个字符可以一次或多次出现
app.get('/ab+cd', function(req, res) {}// 匹配 abcd、abbcd、abbbcd等
//4.星号:星号可以是任意内容,也就是星号两边的字符之间,可以填充任意字符
app.get('/ab*cd', function(req, res) {}// 匹配 abcd、abxcd、abRABDOMcd、ab123cd
//5.括号:把括号中的字符看成一个整体
app.get('/ab(cd)+e', function(req, res) {}// 匹配 /abcde、/abcdcdcdcded等
4.3.正则表达式
// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
res.send('/a/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
5.路由句柄
路由的回调函数与中间件
类似:
可以为请求处理提供多个回调函数,其行为类似中间件。
区别:
这些回调函数有可能调用 next('route') 方法而略过其他路由回调函数。
利用该机制作为路由定义的前提条件:
如果在现有路径上继续执行没有意义,则可将控制权交给剩下的路径。
路由句柄的形式
有多种形式,可以是一个函数、一个函数数组,或者是两者混合
- 使用一个回调函数处理路由:
app.get('/example/a', function (req, res) {
res.send('Hello from A!');
});
- 使用多个回调函数处理路由(记得指定 next 对象):
app.get('/example/b', function (req, res, next) {
console.log('response will be sent by the next function ...');
next();//指定next对象
}, function (req, res) {//第二个回调函数
res.send('Hello from B!');
});
- 使用回调函数数组处理路由:
var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
var cb2 = function (req, res) {
res.send('Hello from C!');
}
app.get('/example/c', [cb0, cb1, cb2]);//是多个回调函数的方式的改进,显得规整
- 混合使用函数和函数数组处理路由:
var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
// 就是上述两个方法一起用
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from D!');
});