added middleware exercise
This commit is contained in:
81
exercice6.ts
Normal file
81
exercice6.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import { Application, Context, Next, Router } from "jsr:@oak/oak";
|
||||
|
||||
export enum APIErrorCode {
|
||||
NOT_IMPLEMENTED = "NOT_IMPLEMENTED",
|
||||
SERVER_ERROR = "SERVER_ERROR",
|
||||
}
|
||||
|
||||
export interface APIError {
|
||||
code: APIErrorCode;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface APISuccess<T> {
|
||||
success: true;
|
||||
data: T;
|
||||
error?: never;
|
||||
}
|
||||
|
||||
export interface APIFailure {
|
||||
success: false;
|
||||
data?: never;
|
||||
error: APIError;
|
||||
}
|
||||
|
||||
export type APIResponse<T> = APISuccess<T> | APIFailure;
|
||||
|
||||
class APIException extends Error {
|
||||
readonly code: APIErrorCode;
|
||||
readonly status: number;
|
||||
|
||||
constructor(code: APIErrorCode, status: number, message: string) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
|
||||
async function errorMiddleware(ctx: Context, next: Next) {
|
||||
try {
|
||||
// On passe à la prochaine fonction de la chaîne
|
||||
await next();
|
||||
} catch (err) {
|
||||
if (err instanceof APIException) {
|
||||
const responseBody: APIFailure = {
|
||||
success: false,
|
||||
error: {
|
||||
code: err.code,
|
||||
message: err.message,
|
||||
}
|
||||
};
|
||||
|
||||
ctx.response.status = err.status;
|
||||
ctx.response.body = responseBody;
|
||||
} else {
|
||||
console.error(err);
|
||||
|
||||
const responseBody: APIFailure = {
|
||||
success: false,
|
||||
error: {
|
||||
code: APIErrorCode.SERVER_ERROR,
|
||||
message: "Unexpected server error",
|
||||
}
|
||||
};
|
||||
|
||||
ctx.response.status = 500;
|
||||
ctx.response.body = responseBody;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const router = new Router();
|
||||
|
||||
router.get("/", errorMiddleware, (ctx) => {
|
||||
throw new APIException(APIErrorCode.NOT_IMPLEMENTED, 501, "I need more time...");
|
||||
});
|
||||
|
||||
const app = new Application();
|
||||
app.use(router.routes());
|
||||
app.use(router.allowedMethods());
|
||||
|
||||
app.listen({ port: 8000 });
|
||||
Reference in New Issue
Block a user