typescript / intermediate
Snippet
Entwurf einer minimalen Middleware-Pipeline für Aufgaben-Handler
Middleware-Pipelines verarbeiten Anfragen oder Aufgaben sequentiell. Durch Parametrisierung der Middleware-Funktionen mit generischem Kontext erzielt man eine erweiterbare Logikkette mit voller Autovervollständigung und Typsicherheit.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type MiddlewareContext = Record<string, unknown>;type NextFunction = () => Promise<void>;type Middleware<C extends MiddlewareContext> = (ctx: C, next: NextFunction) => Promise<void>;class MiddlewarePipeline<C extends MiddlewareContext> {private middlewares: Middleware<C>[] = [];use(middleware: Middleware<C>): void {this.middlewares.push(middleware);}async execute(context: C): Promise<void> {const run = async (index: number): Promise<void> => {if (index < this.middlewares.length) {const middleware = this.middlewares[index];await middleware(context, () => run(index + 1));}};await run(0);}}interface RequestContext extends MiddlewareContext {userId?: string;isAuthorized: boolean;}const pipeline = new MiddlewarePipeline<RequestContext>();pipeline.use(async (ctx, next) => {ctx.userId = "user_42";await next();});pipeline.use(async (ctx, next) => {ctx.isAuthorized = ctx.userId !== undefined;await next();});await pipeline.execute({ isAuthorized: false });
Erklärung
1
type NextFunction = () => Promise<void>;
Definiert die Steuerungsfunktion, um den nächsten Schritt in der Pipeline aufzurufen.
2
type Middleware<C extends MiddlewareContext> = (ctx: C, next: NextFunction) => Promise<void>;
Beschreibt einen asynchronen Handler, der auf einem gemeinsamen Kontextobjekt arbeitet.
3
async execute(context: C): Promise<void>
Führt Middleware-Schritte rekursiv in der Reihenfolge ihrer Registrierung aus.