Express路由

概念

在Express中,路由指的是客户端的请求与服务器处理函数之间的映射关系.
Express的路由分为三个部分:请求的类型,请求的URL地址,处理函数
格式如下:

路由匹配的注意点

1.按照定义的先后顺序进行匹配
2.请求类型和请求的URL同时匹配成功,才会调用对应的处理函数

挂在路由的方式

1.直接挂在到app上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    const express = require('express')
const app = express()

// 挂载路由
app.get('/',(req,res)=>{
res.send('hello world')
})


app.post('/',(res,req)=>{
res.send('post Request.')
})


app.listen(80,()=>{
console.log('http://127.0.0.1')
})

2.将路由抽离为单独的模块进行挂载
2.1步骤:
(1).创建路由模块对应的js文件
(2).调用express.Router()函数创建路由对象
(3).向路由对象上挂载具体的路由
(4).使用module.exports向外共享路由对象
(5).向app.use()函数注册路由模块

路由模块化.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let express = require('express')
let app = express()

// 导入路由模块
let router = require('./router')


// 注册路由模块
// 作用:注册全局中间件
// 挂载前缀
app.use('/api',router)

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

router.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 路由模块
let express = require('express')

let router = express.Router()

// 挂载路由

router.get('/user/list',(req,res)=>{
res.send('Get User List.')
})

router.post('/user/add',(req,res)=>{
res.send('Add new User')
})

// 向外导出路由对象

module.exports = router

中间件

概念:业务中,中间处理的环节
格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let express = require('express')
let app = express()

// 定义中间件函数
const mw = function(req,res,next){
console.log('这是一个简单的中间件函数')
// 把流转关系转交给下一个中间件或路由
next()
}

// 全局生效的中间件
app.use(mw)


app.get('/',(req,res)=>{
res.send('Home Page.')
})

app.get('/user',(req,res)=>{
res.send('User Page.')
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

中间件函数的简化形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
// // 定义中间件函数
// const mw = function(req,res,next){
// console.log('这是一个简单的中间件函数')
// // 把流转关系转交给下一个中间件或路由
// next()
// }

// // 全局生效的中间件
// app.use(mw)
app.use((res,req,next)=>{
console.log('这是简单的中间件函数')
next()
})

中间件的作用

1.多个中间件之间可以用共享同一份req,res:统一为req或res对象添加自定义的属性或方法
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let express = require('express')
let app = express()

app.use((res,req,next)=>{
// 获取请求到达服务器的时间
const time = Date.now()
// 为req挂载自定义属性,从而把time共享给后面的路由
req.startTime = time
next()
})

app.get('/',(req,res)=>{
res.send('Home Page.'+ req.startTime)
})

app.get('/user',(req,res)=>{
res.send('User Page.'+req.startTime)
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

局部生效的中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require('express')
const app = express()

// 定义中间件函数
const mw1 = (req,res,next)=>{
console.log('调用了局部生效的中间件')
next()
}

app.get('/',mw1,(req,res)=>{
res.send('Home page.')
})

app.get('/user',(req,res)=>{
res.send('User page.')
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

同时使用多个局部中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const express = require('express')
const app = express()

// 定义中间件函数
const mw1 = (req,res,next)=>{
console.log('调用了第一个局部生效的中间件')
next()
}

const mw2 = (req,res,next)=>{
console.log('调用了第二个局部生效的中间件')
next()
}

app.get('/',mw1,mw2,(req,res)=>{
res.send('Home page.')
})

app.get('/user',[mw1,mw2],(req,res)=>{
res.send('User page.')
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

中间件的分类

1.应用级别:绑定到app实例上的中间件
app.use();app.get()/app.post()

2.路由级别:绑定到Router上的中间
express.Router()

3.错误级别:必须注册在所有路由之后
处理函数 function(err,req,res,next){}

4.Express内置的中间件:
(1)express.static:快速托管静态资源
(2)express.json:解析json格式的请求体数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const express = require('express')
const app = express()

// 除了错误级别的中间件,其他中间件,必须在路由之前进行配置
app.use(express.json())

app.post('/user',(req,res)=>{
// 在服务器中,可以使用req.body可以收到客户端发来的请求体数据
console.log(req.body)
res.send('ok')
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})
(3)express.urlencoded:解析URL-encoded格式的请求体数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const express = require('express')
const app = express()

// 除了错误级别的中间件,其他中间件,必须在路由之前进行配置
// 解析表达那中url-encoded格式的数据
app.use(express.urlencoded())
// 在服务器中,可以使用req.body可以收到客户端发来的请求体数据

app.post('/book',(req,res)=>{
console.log(req.body)
res.send('ok')
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

4.第三方中间件:
a.安装

1
npm install <body-parser>

b.使用require()导入中间件
1
const <body-parser> = require('<body-parser>')
c.调用app.use()注册并使用中间件
1
app.use(<body-parser>)

5.自定义中间件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 const express = require('express')
// 作用:解析请求体
const qs = require('querystring')
const app = express()

app.use((req,res,next)=>{
// 定义变量
let str = ''
// 监听req的data事件
req.on('data',(chunk)=>{
str += chunk
})
// 监听req的end事件
req.on('end',()=>{
// 在str中存放的是完整的请求体数据
const body = qs.parse(str)
console.log(body)
req.body = body
next()
})
})

app.post('/user',(req,res)=>{
res.send(req.body)
})

app.listen(80,()=>{
console.log('http://127.0.0.1')
})

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022 BieGua
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信