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