express(二)--中间件

中间件原理

  • 中间件是Express框架学习中最难的部分,同时也是最为核心的技术,我的分享路线如下
    • 1.什么是中间件
    • 2.中间件的本质及工作原理
    • 3.中间件的特点
    • 4.中间件初体验
    • 5.中间件的分类
    • 6.内置中间件的使用
    • 7.第三方中间件的使用

什么是中间件?

为了理解中间件,我们先来看一下我们现实生活中的自来水厂的净水流程。

  • 在上图中,自来水厂从获取水源到净化处理交给用户,中间经历了一系列的处理环节
  • 我们称其中的每一个处理环节就是一个中间件。
  • 这样做的目的既提高了生产效率也保证了可维护性。
    express中间件原理:
中间件的本质及工作原理
//导入模块
const express = require('express');
//创建服务器
let app = express();

/*1.什么是express中间件?: 其实就是一个函数(这个函数有三个参数)
    function(req,res,next){  
        req:请求对象  
        res:响应对象  
        next:下一个中间件 
    }
*/

/*2.express如何使用中间件?: 三种方式  
    app.use('pathname',中间件) :
        pathname不写: 任何请求路径都会执行这个中间件
        pathname写了:任何以pathname开头的请求路径都会执行这个中间件
    	app.get('pathname',中间件) :  请求路径为pathname的get请求会执行这个中间件
    	app.post('pathname',中间件) :  请求路径为pathname的post请求会执行这个中间件
*/

/* 3.express处理网络请求的流程
    a.从上往下依次匹配请求路径,如果匹配成功则执行该中间件
    b.如果这个中间件中调用了:next() ,则会继续往下匹配
    c.如果所有的中间件都无法匹配,则会自动进入一个兜底的中间件响应返回404 not found错误
*/

app.use('/abc',(req,res,next)=>{
    //污水净化第一步:添加絮凝剂
    console.log(11111);
    req.a = '添加了絮凝剂';
    next();
});


app.use('/abc',(req,res,next)=>{
    //污水净化第二步:添加活性炭
    console.log(22222);
    req.b = '添加活性炭';
    next();
});

app.post('/abc',(req,res,next)=>{
    console.log(33333);
    next();
});

app.get('/abc',(req,res,next)=>{
    console.log(44444);
    //看下污水净化到这一步加了什么
    console.log(req.a);
    console.log(req.b);
    res.send('hello');
});



//express底层有一个默认的兜底中间件,如果上面所有的中间件都无法匹配或者没有结束响应,则会进入这个中间件
//自定义一个兜底中间件,覆盖默认的
app.use((req,res)=>{
    console.log(55555);
    
    res.send('你的路径是不是写错啦');
});



//开启服务器
app.listen(3000, () => {
    console.log('success');
});

中间件的特点

  • 每个中间件函数,共享req对象、共享res对象
  • 不调用next(),则程序执行到当前中间件函数后,不再向后执行
  • 注意中间件的顺序,因为有可能因为顺序原因,你的中间件函数不会执行
  • 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
  • 客户端发送过来的请求,可能连续调用多个中间件进行处理

中间件初体验

为所有的请求,统一设置响应头

// 所有的接口解决跨域问题
// 自定义中间件函数,统一处理跨域
app.use((req, res, next) => {
    // 为后续所有的接口设置响应头,解决跨域问题
    res.set({
        'Access-Control-Allow-Origin': '*'
    });
    next();
});

中间件详细使用方法
app.use的第一个参数

// 匹配url开头是 /my 的接口,比如 /my/aa  /my/bb ,但是不能匹配 /mynadsf
app.use('/my', (req, res, next) => {
    req.abc = '123';
    next();
});

// 匹配url的开头是 /my 的接口,比如 /my/aa  /my/bb  /mysadfa   /myasdfdd
app.use('/my*', (req, res, next) => {
    .....
});

app.get 和 app.post使用多个中间件

// app.get('/abcd', ()=>{},  ()=>{},  ()=>{}, ....);

app.get('/abcd', (req, res, next) => {
    req.abc = 'a';
    next();
}, (req, res, next) => {
    req.abc += 'b';
    next();
}, (req, res) => {
    res.send(req.abc);
});

// app.get('/abcd', [()=>{},  ()=>{}, ....],  ()=>{});
let a = (req, res, next) => {
    req.abc = 'a';
    next();
};

let b = (req, res, next) => {
    req.abc += 'b';
    next();
}

app.get('/abcd', [a, b], (req, res) => {
    res.send(req.abc);
});

中间件的分类

  • 应用级别中间件
  • 针对整个项目进行配置的中间件,叫做应用级别的中间件
  • 路由级别中间件
  • 写到路由文件中的中间件
  • 错误处理中间件
  • 一般一个项目在最后,设置一个错误处理中间件即可。
  • 错误处理中间件,需要填4个参数(err, req, res, next)
  • 内置中间件
  • express自带的中间件
  • express.urlencoded()
  • express.static()
  • 第三方中间件
  • 别人写的模块,发布到npm上,我们下载下来,可以当做express的中间件
    *cors - 解决跨域的

内置中间件的使用

第三方中间件的使用

第三方中间件使用实际上,实现跨域资源共享,可以使用一个叫做 cors 的第三方模块。推荐使用它来实现跨域资源共享。

使用方法:

下载安装cors `npm install cors --save`
const cors = require('cors'); — 加载模块
app.use(cors()); – 注册中间件即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值