NodeJS学习笔记(六) 中间件 | 跨域

Express 中间件

业务流程的中间处理环节,必须有输入输出

中间件的作用

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

格式

本质上是一个function函数

var express = require('express')   //导入Express模块
var app = express()       //创建服务器
app.get('/',function(req,res,next){next();})  //中间件
app.listen(80)        //启动服务器

中间件函数的形参中,必须包含next参数。而路由处理函数中,只包含req和res

next函数作用

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

定义中间件函数

const mw=function(req,res,next){
	console.log('这是一个最简单的中间件函数');
	next();
}

全局生效的中间件

任何请求都会出发的中间件
app.use(中间件函数)

//将mv注册为全局中间件
app.use(mw)

中间件的作用

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

局部生效中间件

不使用app.use()定义的中间件,叫做局部生效的中间件

注意事项

在路由之前注册中间件
不要忘记调用next()
next()之后不要再写代码
连续多个调用,共享req和res对象

中间件的分类

1.应用级别
通过app.use(),.get.post 就是应用级别
2.路由级别
绑定到express.Route()实力上的中间件
3.错误级别
捕获整个项目中的异常错误
包含四个形参(err,req,res,next)

一定要注册在所有路由之后

4.Express内置的中间件
express.static快速托管静态资源的内置中间件
express.json解析JSON格式的请求体数据
express.urlencoded解析URL-encoded格式的请求体数据
5.第三方中间件
例如
导入解析表单数据的中间件,body-parser
const parser=require(‘body-parser’)
app.use(parser.urlencoded({extended:false}))

如果没有配置任何解析表单数据的中间件,则req.body默认等于undefined

接口的跨域问题 CORS

CORS:
1.运行npm i cors进行安装
2.使用const cors = require(‘cors’)
3.路由之前,调用app.use(cors()) 配置中间件

CORS响应头部-Access-Control-Allow-Origin
如果指定了Access-Control-Allow-Origin字段的值为通配符*,表示允许来自任何域的请求
res.setHeader(‘Access-Control-Allow-Origin’,‘*’)

CORS响应头部-Access-Control-Allow-Headers
默认情况下,CORS仅支持客户端向服务器发送如下的9个响应头
Accept,Accept-Language,Content-Language,DPR,Downlink,Sava-Data,Viewport-Width,Width,Content-Type(值仅限于text/plain,mutipart/form-data,application/x-www-form-urlencoded三者之一)
如果客户端向服务器发送了额外的请求头信息,则需要在服务端,通过Access-Control-Allow-Headers对额外的请求头进行声明,否则这次请求会失败

CORS响应头部-Access-Control-Allow-Methods
默认情况下,CORS仅支持客户端发起GET、POST、HEAD请求 ,如果客户端希望通过PUT,DELETE等方式请求服务器资源,则需要在服务器端,通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法。

CORS请求的分类

客户端在请求CORS接口时,根据请求方式和请求头的不同,可以将CORS的请求分为两大类,分别是:简单请求、预检请求
简单请求:
GET POST HEAD之一
HTTP头部信息不超过以下几种字段Accept,Accept-Language,Content-Language,DPR,Downlink,Sava-Data,Viewport-Width,Width,Content-Type(值仅限于text/plain,mutipart/form-data,application/x-www-form-urlencoded三者之一)

预检请求:
请求方式为GET POST HEAD 之外的类型
请求头中包含了自定义的头部字段
向服务器发送了application/json格式的数据

你可能感兴趣的:(前端,中间件,学习,javascript,node.js)