Express中的路由

92 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

“金秋十月,我要连续30天更文,做劳模,拿手机摄影神器!点击查看活动详情 “即可成功参与

Express介绍

基于node.js平台,快速、开放、极简的web开发框架

通俗的理解:Express的作用和node.js内置的http模块类似,是专门用来创建web服务器的

Express本质:是一个npm第三方包,提供了快速创建web服务器的便捷方法

express提供了中间件功能

能做什么,对于前端来说最常见的两种服务器:

  • web网站服务器:专门对外提供web网页资源的服务器
  • API接口服务器:专门对外提供API接口的服务

创建基本服务器

//导入Express
const express=require('express')
​
//创建web服务器
const app=express()
​
//监听请求并处理: 
app.get('GET请求的地址', 处理函数);
​
app.post('POST请求的地址', 处理函数);
​
//启动服务器
调用app.listen(端口号,启动成功后的回调函数)

把内容响应给客户端

通过 res.send()方法,可以把处理好的内容,发送给客户端

get请求响应:
app.get('/api/getbooks', (req, res) => {
  res.send({ status: 0, message: '成功' })
})
post请求响应:
app.post('/api/getbooks', (req, res) => {
  res.send({ status: 0, message: '成功' });
})
​
如果响应JS对象,send方法会自动将对象转成JSON格式
send会根据响应体,自动设置 Content-Type 响应头

res.end()方法:只能发送字符串,且默认没有设置头信息,是原生http自带的方法

res.send()方法:能发送字符串和对象,并且自动设置头信息,是express封装之后的方法

获取请求URL地址中的参数

获取URL中携带的字符串参数

当用户在URL中,采用字符串的形式(/books?name=‘123’&age=12)发送参数时,我们可以通过req.query对象可以访问到客户端通过字符串的形式,发送到服务器的参数

app.get('/api/getbooks', (req, res) => {
  req.query //默认是一个空对象,如果传的参数为字符串格式,则里面存储参数对象
})

获取URL中携带的:动态参数

当用户在URL中,采用:的形式(/books/:id)发送参数时,我们可以通过req.params对象,可以访问到URL中,通过:匹配到的动态参数

app.get('/api/getbooks/:id', (req, res) => {
  req.params //默认是一个空对象,如果传的参数为动态参数,则里面存放通过:动态匹配到的参数值{id:动态参数值}
})
:后面的字符串可以任意取名
可以匹配多个动态参数-> :id/:name

Express中的路由

在Express中,路由指的是客户端的请求服务器处理函数之间的映射关系

在Express中,路由由三部分组成:请求的类型、请求的地址、对应的处理函数,格式如下:

app.请求类型('请求地址',处理函数) 

路由匹配的过程:每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数(我理解:用户请求类型和请求地址必须和我的请求类型和地址匹配了,我才能给你响应响应的数据

在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的URL同时匹配成功,则Express会将这次请求,转交给对应的function函数进行处理

模块化路由

为了方便对路由进行模块化的管理,推荐将路由抽离为单独的模块

将路由抽离为单独模块的步骤如下:

  • 创建路由模块对应的js文件
  • 调用express.Router()函数创建路由实例对象
  • 向路由实例对象上挂载具体的路由
  • 使用module.exports导出路由实例对象
  • 使用app.user(导入的路由对象)函数注册路由模块
// --------------------- 使用路由的步骤 ----------------------
 *//  1. 加载express模块       
const express = require('express')
​
 *//  2. 创建 router 对象      
const router = express.Router()
​
 *//  3. 把接口挂载到 router 对象上
router.post('/reguser', (req, res) => {})
router.post('/login', (req, res) => {})
​
 * // 4. 导出 router 对象          
module.exports = route
​
 
 * index.js 中
 *  5. 加载路由模块,并注册成中间件  
// 三行必须的代码,启动服务
const express = require('express')
const app = express()
​
// 加载自定义的路由模块,注册中间件
let loginRouter = require('./routers/login')
app.use('/api', loginRouter)
​
app.listen(3006, () => console.log('启动了'))