目录
路由器的行为类似于中间件本身,因为可以将其用作 app.use() 的参数或用作另一台路由器方法 use() 的参数.
顶级express
对象具有创建新对象的 Router() 方法 router .
1.路由路径的匹配
路由路径的匹配有两种模式,一种是字符串模式,另外一种是正则匹配模式.
1.1 字符串模式
- 固定模式
app.get('/index',(req,res) => {
res.send(`<h2>首页</h2>`);
})
- 通配符匹配
//1.2 通配符匹配,匹配所有路径
app.get('/*',(req,res) => {
res.send(`<h2>首页</h2>`);
})
//匹配以index开头的所有路径
/*
/index 可以匹配成功
/index123 可以匹配成功
/index/a/b 可以匹配成功
*/
app.get('/index*',(req,res) => {
res.send(`<h2>首页</h2>`);
})
//匹配以/index/ 开头的路径
app.get('/index/*',(req,res) => {
res.send(`<h2>首页</h2>`);
})
- ? 前面的字符出现0~1次
//1.3 ? 前面的字符或组出现0~1 次
/*
/abce 可以匹配成功
/ace 可以匹配成功
*/
app.get('/ab?ce',(req,res) => {
res.send(`<h2>首页</h2>`);
})
- + 前面的字符出现1~多次
//1.4 + 前面的字符或组出现1~多 次
/*
/abce 可以匹配成功
/abbbce 可以匹配成功
/ace 不能匹配成功
*/
app.get('/ab+ce',(req,res) => {
res.send(`<h2>首页</h2>`);
})
- * 表示出现任意个数的任意字符
//1.5 * 表示任意个数的任意字符
/*
/abc 可以匹配成功
/ab123c 可以匹配成功
*/
app.get("/ab*c", (req,res) => {
res.send(`<h2>首页</h2>`);
})
- () 里的内容为一组
//1.6 ()里的内容为一组
/*
/abcd 可以匹配成功
/ad 可以匹配成功
/abd 不能匹配成功
/acd 不能匹配成功
*/
app.get("/a(bc)?d", (req,res) => {
res.send(`<h2>首页</h2>`);
})
1.2 正则匹配模式
//1. 包含index的路径
/*
/index 可以匹配
/aindexb 可以匹配成功
/a/index/b 可以匹配成功
*/
app.get(/index/, (req,res) => {})
// 2. 以.html后缀名结尾的路径
/*
/index.html 可以匹配
/index/a.html 可以匹配成功
*/
app.get(/.*\.html$/, (req,res) => {})
2.路由器的处理程序
2.1 单处理程序
const express = require('express');
const app = express();
//方式一
app.get('/',(req,res) =>{
res.send(`<h1>首页</h1>`)
})
//方式二
let handle = (req,res) => {
res.send(`<h1>学生页面</h1>`)
}
app.get ('/student',handle);
//监听端口
app.listen(3000,()=>{
console.log('server start at 3000 port');
})
2.2 多处理程序
除非是最后一次处理,否则请不要执行res.send()等发送指令
除非是最后一次处理,否则请不要忘记next形参 与next() 指令
const express = require('express');
const app = express();
//方式一
//除非是最后一次处理,否则请不要执行res.send()等发送指令
// 除非是最后一次处理,否则请不要忘记next形参 与next() 指令
app.get("/", (req,res,next) => {
console.log("handle 1")
next()
},(req,res,next) => {
console.log("handle 2")
next()
},(req,res) => {
res.send("Hello wrold")
})
//方式二
let handle1 = (req,res,next) =>{
console.log("handle 1")
next()
}
let handle2 = (req,res,next) =>{
console.log("handle 2")
next()
}
let handle3 = (req,res,next) =>{
res.send('hello world')
}
app.get('/',[handle1,handle2,handle3])
//监听端口
app.listen(3000,()=>{
console.log('server start at 3000 port');
})
3.express 子应用程序
express模块 每一次执行都会创建一个应用
将子应用通过主应用的use方法挂在到主应用
项目结构如下:
创建学生应用
const express = require('express')
// 创建学生应用
const student = express();
// student路由
student.get("/",(req,res) => {
res.send("student 应用的首页")
})
student.get("/getStudent",(req,res) => {
res.send("student 应用的获取学员信息")
})
//导出学生应用
module.exports = student
创建教师应用
const express = require('express')
// 创建教室应用
const teacher = express();
// teachert路由
teacher.get("/",(req,res) => {
res.send("teacher 应用的首页")
})
teacher.get("/getTeacher",(req,res) => {
res.send("teacher 应用的获取教师信息")
})
//导出教师应用
module.exports = teacher
创建主应用
const express = require('express');
//引入学生路由和教师路由
const student = require('./extrouter/Student');
const teacher = require('./extrouter/Teacher');
//创建主应用程序
const app = express();
//关联主应用程序和子应用程序
app.use("/student",student );
app.use('/teacher',teacher);
app.get('/' ,(req,res) => {
res.send(`<h1>首页</h1>`);
})
//监听端口
app.listen(3000,() => {
console.log('server start at 3000 port');
})
4.express路由
4.1 路由的简介
路由是指接收用户请求,处理用户数据,返回处理结果给用户的一套程序
后端路由的核心是 URL
app.get("/",(req,res,next) => {
})
4.2 express路由的使用
虽然现在可以通过app.get或app.post 定义路由了, 但是在一个项目中, 路由的数量是非常多的, 如果把所有的路由都放在同一文件中,那将是非常可怕的事情,所以express 为了解决这个问题, 提供了模块化构建路由的方式, 我们可以根据条件将路由进行分类.
express 路由使用语法
app.method(path, handle)
参数了解
app: express 实例
method: http 请求方式
path: 请求路径
handle: 路由匹配后执行的函数
//创建路由
const router = express.Router();
router.get('/',(req,res) =>{
res.send(`<h1>首页</h1>`)
})
4.3 路由模块化
express.Router 类可以创建模块化(独立的),可以挂载的路由对象.Router对象是一个完整的中间件和路由系统,因此常称其为一个"mini-app"
需求: 创建一个router路由模块,接受所有 router目录下的所有请求,响应数据
-
创建router模块
-
编写路由模块的代码
const express = require('express');
//引入学生应用和教师应用
const student = require('./student');
const teacher = require('./teacher');
//创建路由
const router = express.Router();
router.get('/',(req,res) =>{
res.send(`<h1>首页</h1>`)
})
//关联主应用和子应用
router.use('/student',student);
router.use('/teacher',teacher);
//导出学生应用
module.exports = router;
3. 将编写好的路由模块引入到主模块,由主模块分配对应的请求到该模块去处理
const express = require('express');
//引入模块
const router = require('./router/index')
//创建主应用
const app = express();
//通过中间件建立主应用和子模块之间的关系
app.use(router);
//监听端口
app.listen(3000,()=> {
console.log('server start at 3000 port');
})
学生应用和教师应用代码与上面express子应用部分相同.
项目结构如下: