この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
53. middleware を作る

以下は TypeScript による回答例です。

type Request = object;

type NextFunc = (error?: any) => void;

type MiddlewareFunc = (req: Request, next: NextFunc) => void;

type ErrorHandler = (error: Error, req: Request, next: NextFunc) => void;

class Middleware {
  private middlewareList: Array<MiddlewareFunc | ErrorHandler>;
  constructor() {
    this.middlewareList = [];
  }

  use(func: MiddlewareFunc | ErrorHandler) {
    this.middlewareList.push(func);
  }

  async start(req: Request) {
    let index = 0;
    const next: NextFunc = (error?: any) => {
      if (error) {
        const errorHandler = this.middlewareList.find(
          (func): func is ErrorHandler => func.length === 3
        );
        if (errorHandler) {
          errorHandler(error, req, next);
        } else {
          throw error;
        }
      } else {
        const func = this.middlewareList[index++];
        if (func) {
          func(req, next);
        }
      }
    };
    await next();
  }
}

Middleware クラスでは、 middlewareList プロパティに use() メソッドで追加された MiddlewareFunc または ErrorHandler を保持し、 start() メソッドを呼び出すことで、このリスト内の中身を順番に実行することができます。

next() 関数は MiddlewareFunc 関数内において次の処理を実行するために必要なものであり、 この関数を実行することで、middlewareList 内のリストを順に実行していくことが可能です。また、 これの引数に error を渡した場合はエラー処理をするための分岐が実行されます。

ErrorHandler が定義されていなかったり、エラーが発生していない場合の処理も書かれているため、特に引数に ErrorHandler を追加する必要はありません。