前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Express中间件

Express中间件

作者头像
简单点
发布2022-10-04 20:33:32
1.6K0
发布2022-10-04 20:33:32
举报
文章被收录于专栏:vaevae

中间件(middleware)就是一个方法,一般情况下需携带next参数,express进行路由配置时的回调函数,但中间件在使用时,一般都是使用use方法。

一,中间件的作用。

  1. 多个中间件之间,共享同一份req和res。基于这样的特性,我们可以在上游中间件中,统一为req或res对象添加自定义的属性或方法,提供给下游的中间件使用。
  2. 客户端发起任何请求,到达服务器后,都会触发的中间件,叫全局生效的中间件。

二,注意事项。

  1. 要在路由之前注册中间件。
  2. 可以连续调用多个中间件处理请求。
  3. 执行完中间件后,不要忘记调用next()函数。
  4. 防止代码混乱,next()后不要写额外代码了。
  5. 连续调用多个中间件时,多个中间件之间,共享req和res。
  6. 中间件可以绑定到reter实例上(路由级别),与app中(应用级别)没有任何区别

三,定义全局中间件。

代码语言:javascript
复制
const express=require('express')
const app=express();
// 这是全局中间件 简单的使用,直接app.use中写函数
app.use((req,res,next)=>{
 //为req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
 const time=Date.now();
    req.startTime=time;
 next();
})
app.get('/',(req,res)=>{
 //多个中间件之间,共享req和res对象,
 //获取到上游中间件中的startTime属性
    res.send('home='+req.startTime)
})
app.get('/user',(req,res)=>{
    res.send('user'+req.startTime)
})
app.listen(1212,()=>{
 console.log('启动成功')
})

四,定义局部中间件。

代码语言:javascript
复制
const express=require('express')
const app=express();
// 1,定义中间件函数
const mw=(req,res,next)=>{
 console.log('调用了局部生效的中间件1')
 next();
}
const mw2=(req,res,next)=>{
 console.log('调用了局部生效的中间件2')
 next();
}
// 2,创建路由
app.get('/',mw,(req,res)=>{
    res.send('home=')
})
// 可以调用多个局部路由中间件, 也可以用 [mw,mw2] 包起来
app.get('/user',mw,mw2,(req,res)=>{
    res.send('user')
})
app.listen(1212,()=>{
 console.log('启动成功')
})

五,错误级别的中间件。

作用: 捕获整个项目中 的异常错误,防止程序崩溃。

注意点:

  1. 错误级别中间件有四个参数,(err,req,res,next)。
  2. 必须注册在所有路由之后。
代码语言:javascript
复制
const express=require('express')
const app=express();
//创建路由
app.get('/',(req,res)=>{
 //制造错误
 throw new Error('服务错误')
    res.send('home=')
})
//定义错误级别的中间件,
app.use((err,req,res,next)=>{
 console.log('发生了错误='+err);
    res.send('Error'+err.message)
})
app.listen(1212,()=>{
 console.log('启动成功')
})

六,Express内置的中间件。

Express中内置了三个中间件。

  1. express.static 快速托管静态资源的内置中间件,如:html,img,css等(无兼容性)
代码语言:javascript
复制
const express=require('express');
const app=express();
//在这里,调用express.static()方法,快速对外提供静态资源
app.use(express.static('./public'))
// 同时托管多个静态资源目录,可以多次调用 express.static
// express.static()函数会根据目录的添加顺序找查所需文件
app.use(express.static('./static'))
//可以加一个前缀
app.use(express.static('/zhang','./static'))
app.listen(1212,()=>{
 console.log('启动成功')
})

  1. express.json 解析json格式的请求数据(仅在4.16.0+版本中可以使用)
  2. express.urlencoded 解析URL-encoded格式的请求体数据(仅在4.16.0+版本中可以使用)
代码语言:javascript
复制
const express=require('express')
const app=express();
// 注意,除了错误级别的中间件,其他中间件,必须在路由之前进行配置
// 通过 express.json 中间件,解析表单中的json格式数据
app.use(express.json())
// 通过 express.urlencoded()中间件,来解析表单中的url-encoded 格式的数据
app.use(express.urlencoded({extended:false}))
// 创建路由
app.post('/',(req,res)=>{
 //在服务器,可以使用req.body这个属性,来接收客户端发送过来的请求体数据
 // 默认情况下,如果不配置解析表单数据的中间件(express.json()),则req.body默认等于undefined
 console.log(req.body)
    res.send('ok')
})
app.post('/book',(req,res)=>{
 // 默认情况下,如果不配置解析表单数据的中间件(express.urlencoded({extended:false})),则req.body默认等于{}
 console.log(req.body)
    res.send('ok')
})
app.listen(1212,()=>{
 console.log('启动成功')
})

注意:除了错误级别的中间件,其他中间件,必须在路由之前进行配置。

七,自定义中间件。

代码语言:javascript
复制
const express=require('express')
// 导入node。js 内置的querystrin模块
const qs= require('querystring')
const app=express();
//自定义解析表单数据的中间件
app.use((req,res,next)=>{
 // 1,定义str字符串,存储客户端发送过来的请求数据
 let str=''
 //2,监听 req的data事件
    req.on('data',(chunk)=>{
        str+=chunk;
    })
 //2,监听 req 的end 事件
    req.on('end',()=>{
 // 在str中存放的是完整的请求数据
 console.log(str)
 // 解析成对象格式
 const body= qs.parse(str);
 console.log(body)
 //将解析出来的数据,挂载到body属性上给下游使用
        req.body=body;
 next();
    })
})
// 创建路由
app.post('/',(req,res)=>{
    res.send(req.body)
})
app.listen(1212,()=>{
 console.log('启动成功')
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,中间件的作用。
  • 二,注意事项。
  • 三,定义全局中间件。
  • 四,定义局部中间件。
  • 五,错误级别的中间件。
  • 六,Express内置的中间件。
  • 七,自定义中间件。
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档