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