Node.JS (中)

文章目录

8.初识Express

8-1.什么是Express

  1. 基于 Node.js 平台,快速、开放、极简的 Web 开发框架

8-2.学习目标

  1. 能够使用express.static() 快速托管静态资源
  2. 能够使用express路由精简项目结构
  3. 能够使用常见的express中间件
  4. 能够使用express创建API接口
  5. 能够在express中**启用cors跨

8-3.express能做什么

  1. **Web网站服务器:**专门对外提供Web网页资源的服务器
  2. **API接口服务器:**专门对外提供API接口服务器

9.express的基本使用

  1. 安装:npm i express@4.17.1
    请添加图片描述

9-1.创建基本的web服务器

  1. 导入express
  2. 创建web服务器
  3. 调用app.listen(端口号,回调函数),启动服务器

请添加图片描述

9-2.监听get请求

  1. 通过app.get()方法监听get请求
// 4.监听客户端的get和post请
app.get('/user',(req,res)=>{
    // 调用express提供的res.send()方法,向客户端响应一个json对象
    res.send({name:'lq',age:22,sex:'男'})
})

9-3.监听post请求

  1. 通过app.post()方法监听post请求
app.post('/user',(req,res)=>{
    // 调用express提供的res.send()方法,向客户端响应一个文本
    res.send('请求成功')
})

9-4.res.send()方法

  1. 通过res.send()方法可以把处理好的内容,发给客户端
    代码图片:
    请添加图片描述
    get请求
    请添加图片描述
    post请求
    请添加图片描述

9-5.获取URL中携带的查询参数(req.query)

  1. 通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数
    代码演示:
app.get('/',(req,res)=>{
    console.log(req.query);
})

结果展示:
请添加图片描述

9-6.获取URL中动态参数

  1. 通过req.params对象,可以访问到URL中通过:匹配到的动态参数

代码演示:

const express = require('express')
const app = express()
// 1. 通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数
app.get('/user/:id',(req,res)=>{
    console.log(req.params);
    res.send(req.params)
})
app.listen(80 , (req,res)=>{
    console.log('express运行在192.168.0.101');
})

结果展示:
请添加图片描述

9-7.托管静态资源(express.static())

  1. 通过express.static(),我们可以非常方便的创建一个静态资源服务器,例如如下代码就可以将public目录下的图片、css、js文件对外开放
  2. app.use(express.static(‘public’))

代码演示:

const express = require('express')
const app = express()
// 1. 通过express.static(),我们可以非常方便的创建一个静态资源服务器
app.use(express.static('public'));
app.listen(80 , (req,res)=>{
    console.log('express运行在192.168.0.101');
})

结果展示:
请添加图片描述

9-7.托管多个静态资源目录

1. 多次使用app.use(express.static(‘public’))就可以

2. 访问静态资源文件时,express.static()函数会根据目录添加顺序查找所需要的文件

9-8.挂在路径前缀

  1. app.use('前缀’express.static(‘public’))

代码演示:

const express = require('express')
const app = express()
// 1. 通过express.static(),我们可以非常方便的创建一个静态资源服务器
app.use('public',express.static('public'));
app.use('/pub',express.static('pub'));
app.listen(80 , (req,res)=>{
    console.log('express运行在192.168.0.101');
})

结果展示:
请添加图片描述

10.Express路由

10-1.路由的概念

  1. 在Express中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
  2. Express中的路由分3部分组成,分别是请求的类型请求的URL地址处理函数
    请添加图片描述
  3. 按照定义的先后顺序进行配
  4. 请求类型和请求的URL同时匹配成功才会调用相应的处理函数

10-2.路由的使用

  1. 在express中使用路由最简单的方式,就是把路由挂载到app上
    请添加图片描述

10-2.模块化路由

为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到app,上,而是推荐将路由抽离为单独的模块。

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

  1. 创建路由模块对应的.js文件
  2. 调用express.Router()函数创建路由对象
  3. 向路由对象上挂载具体的路由
  4. 使用module.exports向外共享路由对象
  5. 使用app.use0函数注册路由模块

代码演示:

// 1.导入express
const express = require('express')
// 2. 调用express.Router()函数创建路由对象 
var router = express.Router()
// 3. 向路由对象上挂载具体的路由
router.get('/user/list',(req,res)=>{
    res.send('get挂载成功')
})
router.post('/user/add',(req,res)=>{
    res.send('post挂载成功')
})
// 4. 使用module.exports向外共享路由对象 
module.exports = router

10-3.注册路由模块

  1. 导入路由模块
  2. 使用app.use(模块)

代码演示:

// 1. 导入路由模块
const ly = require('./08.创建路由模块')
// 2. 使用app.use(模块)
app.use(ly)

10-4.为路由添加前缀

app.use('/api',ly)

11.Express中间件

11-1.中间件的概念

  • 当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。

11-2.中间件的格式

  • express的中间件本质上就是一个function处理函数
  • 中间件的格式如下
    请添加图片描述
    注意:中间件函数的形参列表中,必须包含next参数,而路由处理函数中只包含req和res

11-3.next函数的作用

  • next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一一个中间件或路由。

12.中间件的初体验

12-1.定义一个简单的中间件

请添加图片描述

12-2.全局生效的中间件

  • 客户端发起的请求,到达服务器后,都会触发的中间件,叫做全局生效中间件
  • app.use(中间件名称)

请添加图片描述

12-3.简化全局中间件

请添加图片描述

12-4.中间件的作用

  • 多个中间件之间,共享同-份req和res.基于这样的特性,我们可以在上游的中间件中,统-为req或res对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
    请添加图片描述

12-5.定义多个全局中间件

  • 可以使用app.use0连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用,示例代码如下:

请添加图片描述

12-6.局部生效的中间件

  • 不使用app.use()的中间件就是局部中间件
const express = require('express')
const app = express()

// 定义一个中间
var zjj = function(req,rea,next){
    console.log('局部中间件');
    next()
}
app.get('/',zjj,(req,res)=>{
    res.send('局部中间件')
})
app.post('/user',zjj,(req,res)=>{
    res.send('局部中间件')
})
app.listen(80,()=>{
    console.log('run in 192.168.0.101');
})

12-7.定义多个局部中间件

app.get('/',zjj1,zjj2,zjj3,(req,res)=>{
    res.send('局部中间件')
})

12-8.中间件的五个注意事项

  1. 中间件要放在路由前面
  2. 客户端发送请求可以调用多个中间件
  3. 中间件一定不要忽略next()
  4. 为了防止代码混乱,写了next()函数后,就不要写额外的代码了
  5. 连续调用多个中间件,多个中间件之间共享req和res

13.中间件的分类

  1. 应用级别的中间件
  2. 路由级别的中间件
  3. 错误级别的中间件
  4. Express内置的中间件
  5. 第三方的中间件

13-1.应用级别的中间件

  • 通过app.use0或app.get0或app.post0,绑定到app实例上的中间件,叫做应用级别的中间件

13-2.路由级别的中间件

  • 绑定到express.Router0实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别。只不
    过,应用级别中间件是绑定到app实例上,路由级别中间件绑定到router实例上。

13-3.错误级别的中间件

  • 错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。
  • 格式:错误级别中间件的function 处理函数中,必须有4个形参,形参顺序从前到后,分别是(err, req, res, next)。

代码演示:

const express = require('express')
const app = express()

app.get('/',(req,res)=>{
    throw new Error('服务器内部发生错误')
    res.send('index')
})

// 定义一个错误中间件
app.use(function(err,req,res,next){
    console.log('Error'+err.message);
    res.send('Error'+err.message)
    next()
})
app.listen(80,()=>{
    console.log('run in 192.168.0.101');
})

注意:错误中间件一定要注册到路由的后面

13-4.Express内置的中间件

  • express.static快速托管静态资源的内置中间件
  • express.json解析JSON格式的请求数据(在4.16.0版本之前不可用)

请添加图片描述

  • express.urlencoded解析URL-encoded/x-www-form-yrlcoded格式的请求数据(在4.16.0版本之前不可用)

13-5.第三方的中间件

  • 非Express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。

如何使用第三方中间件body-parser,作用:来解析请求体数据

  1. npm install body-parser安装中间件
    请添加图片描述
  2. 使用require导入中间件
  3. 使用app.use()注册中间件
const express = require('express')
const app = express()
// 1. npm install body-parser安装中间件
// 2. 使用require导入中间件
const parser = require('body-parser')
// 3. 使用app.use()注册中间件
app.use(parser.urlencoded({extend:false}))
app.get('/',(req,res)=>{
    res.send('ok')
    console.log(req.body);
})

app.listen(80,()=>{
    console.log('run in 192.168.0.101');
})

13-6.自定义中间件

省略

14.使用Express写接口

14-1.Express写接口步骤

  1. 创办基本服务器
const express = require('express')
const app = express()
app.listen(80,()=>{
    console.log('run in 192.168.0.101');
})
  1. 创建API路由模块
const express = require('express')
const router = express.Router()
router.get('/get',(req,res)=>{
})
module.exports = router
  1. 写GET接口
const express = require('express')
const { appendFile } = require('fs')
const apiRouter = express.Router()

// GET接口
apiRouter.get('/get',(req,res)=>{
    // 1.获取到客户端通过查询字符串,发送到服务器的数据
    const query = req.query
    // 2.调用send()方法,把数据响应给客户端
    res.send({
        status:0, // 状态0表示成功,1表示失败
        msg:'GET请求成功', // 状态描述
        data:query // 响应给客户端的具体数据
    })
})
module.exports = apiRouter
  1. 写POST接口
const express = require('express')
const { appendFile } = require('fs')
const apiRouter = express.Router()

// GET接口

apiRouter.get('/get',(req,res)=>{
    // 1.获取到客户端通过查询字符串,发送到服务器的数据
    const query = req.query
    // 2.调用send()方法,把数据响应给客户端
    res.send({
        status:0, // 状态0表示成功,1表示失败
        msg:'GET请求成功', // 状态描述
        data:query // 响应给客户端的具体数据
    })
})

// POST接口
apiRouter.post('/post',(req,res)=>{
    // 1.获取到客户端通过请求体,发送到服务器的urlencoded数据
    const body = req.body
    // 2.调用send()方法,把数据响应给客户端
    res.send({
        status:0, // 状态0表示成功,1表示失败
        msg:'POST请求成功', // 状态描述
        data:body // 响应给客户端的具体数据
    })
})
module.exports = apiRouter
  1. 导入路由模块(服务器上)
// 导入路由模块、
const router = require('./03.get接口')
  • 把路由模块注册到app上
// 把路由模块注册到app上
app.use('/api',router)
  • 配置解析表单数据的中间件
// 配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))

14-2.成功编写GET/POST接口

请添加图片描述

15.跨域问题

15-1.跨域问题演示请添加图片描述

  • 我们所写的get和post接口不支持跨域请求

15-2.解决跨域问题

  • CORS(主流的解决方案)
  • jsonp(有缺陷:只能支持get请求)

15-3.使用cors中间件解决跨域问题

  1. 运行npm i cors 安装中间件
  2. 在服务器的路由前面导入中间件require(‘cors’)
  3. 在路由之前调用中间件app.use(cors())
    代码演示:
// 在路由前导入使用cors
const cors = require('cors')
app.use(cors())

结果展示:
请添加图片描述

15-4.什么是cors

  1. CORS (Cross-Origin Resource Sharing,跨域资源共享)由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。
  2. 浏览器的同源安全策略默认会阻止网页"跨域”获取资源。但如果接口服务器配置了CORS相关的HTTP响应头,就可以解除浏览器端的跨域访问限制。

注意事项:

  1. CORS主要在服务器端进行配置。客户端浏览器无须做任何额外的配置,即可请求开启了CORS的接口。
  2. CORS在浏览器中有兼容性。只有支持XMLHttpRequest Level2的浏览器,才能正常访问开启了CORS的服务端接口(例如: IE10+. Chrome4+、FireFox3.5+).

15-5.cors响应头

15-5-1.cors响应头 - Access-Control-Allow-Origin

//表示与允许来自任何域的请求
res.setHaeder('Access-Control-Allow-Origin','*')

15-5-2.cors响应头 - Access-Control-Allow-Headers

  • 默认支持9个请求头:Accept. Accept-Language、 Content-Language. DPR、Downlink. Save-Data. Viewport-Width. Width 、Content-Type (值仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)
//允许客户端额外向服务器发送Content-Type 请求头和 X-Custom-Header请求头
res.setHaeder('Access-Control-Allow-Headers','Content-Type','X-Custom-Header')

15-5-3.cors响应头 - Access-Control-Allow-Methods

  • 默认情况下cors仅支持客户端发起GET,POST,HEAD请求
//如果客户端希望通过PUT、DELETE 等方式请求服务器的资源
res.setHaeder('Access-Control-Allow-Methods','POST','GET','HEAD')
//允许所有的HTTP请求方法
res.setHaeder('Access-Control-Allow-Methods','*')

16.cors分类(简单请求和预检请求)

16-1.简单请求

同时满足以下两大条件的请求,就属于简单请求:

  1. 请求方式: GET、POST、HEAD三者之一
  2. HTTP头部信息不超过以下几种字段:无自定义头部字段、Accept. Accept-Language. Content-Language. DPR、Downlink. Save-Data. Viewport- Width. hWidth、Content-Type (只有三个值application/x-ww-form-urlencoded、multipart/form-data、 text/plain)

16-2.预检请求

只要符合以下任何一个条件的请求,都需要进行预检请求:

  1. 请求方式为GET、POST. HEAD 之外的请求Method类型
  2. 请求头中包含自定义头部字段
  3. 向服务器发送了application/json 格式的数据
  4. 在浏览器与服务器正式通信之前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求称为“预检请求”。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忧郁火龙果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值