Express 中间件

Express中间件是业务流程的中间处理环节,允许对请求进行预处理。它们分为应用级别、路由级别和错误级别,每个级别都有其特定的作用和使用场景。中间件之间共享req和res对象,通过next()函数实现连续调用。错误级别中间件用于捕获和处理异常错误,确保项目稳定运行。此外,文章还提到了Express内置的静态资源托管和请求体解析中间件,以及第三方中间件的使用。
摘要由CSDN通过智能技术生成

1. 什么是中间件

  • 特指业务流程的中间处理环节,当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。
  • 事例:
    const express = require('express')
    
    const app = express()
    
    const mw = (req, res, next) => {
      console.log('中间件')
      // next()函数实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。
      next()
    }
    
    app.listen(80, () => {
      console.log('http://127.0.0.1')
    })
    

2. 中间件的作用

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

3. 中间件的分类

  1. 应用级别的中间件:
    • 通过app.use()或app.get()或app.post(), 绑定到app实例上的中间件,叫做应用级别的中间件。
    const express = require('express')
    
    const app = express()
    
    app.listen(80, () => {
      console.log('http://127.0.0.1')
    })
    	
    // 全局生效的中间件
    const mw = (req, res, next) => {
      console.log('中间件')
      // 把流转关系交给下一个中间件
      next()
    }
    
    app.use(mw)
    
    app.use((req, res, next) => {
      console.log('第二个中间件')
      next()
    })
    
    app.get('/', (req, res) => {
      console.log('get /')
      res.send('Home page')
    })
    
    // 局部生效的中间件
    const mw1 = (req, res, next) => {
      console.log('局部中间件')
      next()
    }
    const mw2 = (req, res, next) => {
      console.log('第二个中间件')
      next()
    }
    
    app.get('/', [mw1, mw2], (req, res) => {
      console.log('get /')
      res.send('Home page')
    })
    
    app.get('/user', mw1, (req, res) => {
      res.send('user page')
    })
    
    app.get('/list', (req, res) => {
      res.send('list page')
    })
    
  2. 路由级别的中间件:
    • 绑定到express.Router()实例上的中间件,叫做路由级别的中间件。
    const router = express.Router()
    
    router.use((req, res, next) => {
      console.log("time:", Date.now())
      next
    })
    
    app.use('/', router)
    
  3. 错误级别的中间件
    • 专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。
    • 错误级别的中间件必须注册在所有路由之后
    app.get('/error', (req, res) => {
      // 抛出一个自定义错误
      throw new Error('error page')
      res.send('Error Page')
    })
    
    app.use((err, req, res, next) => {
      // 在服务器答应错误信息
      console.log('发生错误' + err.message)
      // 将错误信息响应给客户端
      res.send('Error:' + err.message)
    })
    
  4. Express内置的中间件
    • express.static()快速托管静态资源的内置中间件。通过该函数可以创建一个静态资源服务器,将public目录下的图片、css文件、javascript文件对外开放。
    // 可以访问public目录中文件,如http://127.0.0.1/js/test.js
    // app.use(express.static('./public'))
    
    // 在托管的静态资源访问路径之前挂载路径前缀
    // http://127.0.0.1/public/js/test.js
    app.use('/public', express.static('./public'))
    
    • express.json()解析JSON格式的请求体数据
    app.use(express.json())
    
    app.post('/user', (req, res) => {
      // 在服务器可以使用req.body属性来接受客户端大宋的请求数据体
      // 默认情况下,如果不配置解析表单数据的中间件,req.body等于undefined
      console.log(req.body)
      res.send('OK')
    })
    
    • express.urlencode()解析URL-encoded格式的请求体数据
    app.use(express.urlencoded({ extended: false }))
    app.post('/book', (req, res) => {
      console.log(req.body)
      res.send('OK')
    })
    
  5. 第三方的中间件
    • 非Express官方内置的,而是由第三方开发出来的中间件。
    • 事例如下:
      • 运行 npm i body-parser安装中间件
      • 使用require导入
      • 调用app.use()注册并使用中间件
    const express = require('express')
    
    const app = express()
    
    const parser = require('body-parser')
    
    app.use(parser.urlencoded({ extended: false }))
    
    app.get('/book', (req, res) => {
      res.send('ok')
    })
    
    app.post('/user', (req, res) => {
      console.log(req.body)
      res.send('ok')
    })
    
    app.listen(80, () => {
      console.log('http://127.0.0.1')
    })
    

3. 注意事项

  1. 一定要在路由之前注册中间件
  2. 客户端发送过来的请求,可以连续调用多个中间件进行处理
  3. 执行完中间件业务代码之后,不要忘记调用next()
  4. 为了防止代码逻辑混乱,调用next()函数后不要写额外的代码
  5. 连续调用多个中间件时,多个中间件之间,共享req和res对象
Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值