组合请求处理程序

问题

在 Qwik 应用程序中,我们经常需要多个请求处理程序来执行 中间件函数。事实上,根据 单一职责原则,中间件函数被开发为只执行一项任务(例如,建立数据库连接)。有了这些前提,在保持调用顺序的同时组合多个请求处理程序可能会很复杂。例如,您有一个请求处理程序用于连接到数据库,另一个用于加载当前用户记录,后者依赖于前者,因此它们必须按顺序调用。

解决方案

如果您想将多个请求处理程序链接在一起,可以使用此实用程序函数。

import type { RequestHandler } from '@builder.io/qwik-city';
 
/**
 * Combines multiple request handlers into a single request handler.
 *
 * The handlers will be called in order:
 *
 * 1. Handler1 before next()
 * 2. Handler2 before next()
 * 3. Handler3 before next()
 * 4. Next()
 * 5. Handler3 after next()
 * 6. Handler2 after next()
 * 7. Handler1 after next()
 *
 * @public
 */
 
export const combineRequestHandlers = (...handlers: RequestHandler[]): RequestHandler =>
  async (originalContext) => {
    let lastNext = originalContext.next;
    for (let i = handlers.length - 1; i >= 0; i--) {
      const currentHandler = handlers[i];
      const nextInChain = lastNext;
      lastNext = async () => {
        await currentHandler({ ...originalContext, next: nextInChain });
      };
    }
 
    await lastNext();
  };

贡献者

感谢所有帮助改进此文档的贡献者!

  • gioboa
  • erikras