当前位置:首页 > JavaScript

js 实现middleware

2026-04-05 08:28:29JavaScript

中间件(Middleware)概念

中间件是一种在请求和响应之间执行特定功能的机制,常用于处理请求前后的逻辑(如日志、鉴权、数据转换)。在JavaScript中,中间件广泛应用于Express、Koa等框架。

实现基础中间件模式

以下是一个简单的中间件实现示例,模拟类似Express的中间件机制:

function createMiddleware() {
  const middlewareStack = [];

  const use = (fn) => {
    middlewareStack.push(fn);
  };

  const run = (context) => {
    let index = 0;
    const next = () => {
      if (index < middlewareStack.length) {
        const currentFn = middlewareStack[index++];
        return currentFn(context, next);
      }
    };
    next();
  };

  return { use, run };
}

使用示例:

const app = createMiddleware();

app.use((ctx, next) => {
  console.log('Middleware 1 - Start');
  next();
  console.log('Middleware 1 - End');
});

app.use((ctx, next) => {
  console.log('Middleware 2 - Start');
  next();
  console.log('Middleware 2 - End');
});

app.run({}); // 执行中间件栈

异步中间件支持

通过async/await支持异步操作:

function createAsyncMiddleware() {
  const middlewareStack = [];

  const use = (fn) => {
    middlewareStack.push(fn);
  };

  const run = async (context) => {
    let index = 0;
    const next = async () => {
      if (index < middlewareStack.length) {
        const currentFn = middlewareStack[index++];
        await currentFn(context, next);
      }
    };
    await next();
  };

  return { use, run };
}

使用示例:

const app = createAsyncMiddleware();

app.use(async (ctx, next) => {
  console.log('Async Middleware 1 - Start');
  await new Promise(resolve => setTimeout(resolve, 1000));
  await next();
  console.log('Async Middleware 1 - End');
});

app.run({});

洋葱圈模型实现

Koa风格的洋葱圈模型(中间件双向执行):

function createOnionMiddleware() {
  const middlewareStack = [];

  const use = (fn) => {
    middlewareStack.push(fn);
  };

  const compose = (context) => {
    let index = -1;
    const dispatch = (i) => {
      if (i <= index) throw new Error('next() called multiple times');
      index = i;
      const fn = middlewareStack[i] || (() => {});
      return fn(context, dispatch.bind(null, i + 1));
    };
    return dispatch(0);
  };

  return { use, run: compose };
}

执行顺序说明:

  1. 中间件按注册顺序执行next()前的代码。
  2. 遇到next()会暂停当前中间件,执行下一个中间件。
  3. 最后一个中间件执行完毕后,逆序执行剩余代码。

实际应用场景

  1. 日志记录:在请求前后记录时间戳和参数。
  2. 权限校验:拦截未授权的请求。
  3. 数据预处理:对请求体进行格式化或验证。

示例:权限校验中间件

js 实现middleware

app.use((ctx, next) => {
  if (!ctx.headers.token) {
    throw new Error('Unauthorized');
  }
  next();
});

注意事项

  • 避免在中间件中阻塞主线程(长时间同步操作)。
  • 错误处理需通过try/catch或顶层错误事件捕获。
  • 中间件的顺序会影响执行逻辑,需谨慎设计。

通过以上模式,可灵活扩展中间件功能,适应不同场景需求。

标签: jsmiddleware
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…