Wsh's blog Wsh's blog
首页
  • 基础知识
  • ArkUI
  • UIAbility
  • 组件通信方式
  • 前端缓存
  • React
  • typescript
  • javascript
  • flutter
  • node
  • webpack
web3D😉
宝库📰
  • 分类
  • 标签
  • 归档
龙哥的大🐂之路 (opens new window)
GitHub (opens new window)

wsh

热爱前端的程序媛
首页
  • 基础知识
  • ArkUI
  • UIAbility
  • 组件通信方式
  • 前端缓存
  • React
  • typescript
  • javascript
  • flutter
  • node
  • webpack
web3D😉
宝库📰
  • 分类
  • 标签
  • 归档
龙哥的大🐂之路 (opens new window)
GitHub (opens new window)
  • 深入浅出node

  • nest框架

  • koa

    • 中间件
      • 1. 概念
        • 1.1 什么是中间件
        • 1.2. 链式调用
      • 2. 洋葱圈模型
      • 3. 异步处理
    • 路由
    • 错误处理
  • node
  • koa
2022-05-22
目录

中间件

# 1. 概念

# 1.1 什么是中间件

中间件是在请求与响应之间处理的处理程序。

有时候从请求到响应之间的业务比较复杂,将这些复杂的业务拆分成一个个功能独立的函数,就是中间件。

对于处理数据而言,在响应发出之前,可以在请求和响应之间做一些操作,并且将这个处理结果传递给下一个函数继续处理。

提示

中间件函数,帮助拆解主程序的业务逻辑 并且每一个的中间件函数处理的结果都会传递给下一个中间件函数

就好比工厂g流水线的工人清洗箱子

第一个人清洗侧面,第二个人清洗底面,第三个人清洗顶面。。。

这条流水线结束,箱子也就清洗干净了。 各做各的,互不影响,又彼此协作。

# 1.2. 链式调用

app.use 实际上会返回this

app.use(function) 将给定的中间件方法添加到该应用程序。app.use()返回this,所以可以链式调用

app.use(someMiddle)
app.use(someOtherMiddle)

app.use(someMiddle)
.use(someOtherMiddle)

注意: 在use中一次只能接受一个函数作为参数。

# 2. 洋葱圈模型

一层一层调用再逐级返回。

const Koa = require("koa");
const app = new Koa();

app.use((ctx, next) => {
  console.log(1);
  next();
  console.log(2);
});

app.use((ctx, next) => {
  console.log(3);
  next();
  console.log(4);
});
app.use((ctx) => {
  console.log(5);
  ctx.body = "组成1完成";
});

app.listen(3002);
输出结果:
1
3
5
4
2

# 3. 异步处理

koa 源码

function compose (middleware) {
  return function (context, next) {
    let index = -1
    return dispatch(0)
    function dispatch (i) {
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      index = i
      let fn = middleware[i]
      if (i === middleware.length) fn = next
      if (!fn) return Promise.resolve()
      try {
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}
基本原理
路由

← 基本原理 路由→

最近更新
01
组件通信方式
01-07
02
UIAbility
01-07
03
ATKTS
01-06
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Wsh | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式