この解答例は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 を追加する必要はありません。