Skip to content

Bun bietet mehrere Möglichkeiten, Fehler in HTTP-Servern zu behandeln.

Try-Catch in Routen

Verwenden Sie try-catch-Blöcke, um Fehler in Ihren Routen-Handlern zu behandeln:

ts
Bun.serve({
  routes: {
    "/users/:id": async req => {
      try {
        const userId = req.params.id;
        const user = await db.getUser(userId);
        
        if (!user) {
          return new Response("Benutzer nicht gefunden", { status: 404 });
        }
        
        return Response.json(user);
      } catch (error) {
        console.error("Fehler beim Abrufen des Benutzers:", error);
        return new Response("Interner Serverfehler", { status: 500 });
      }
    },
  },
});

Globaler Error-Handler

Verwenden Sie die error-Option in Bun.serve(), um einen globalen Error-Handler zu definieren:

ts
Bun.serve({
  routes: {
    "/": () => new Response("Hallo Welt"),
    "/error": () => {
      throw new Error("Etwas ist schiefgelaufen!");
    },
  },
  error(error) {
    console.error("Globaler Fehler:", error);
    return new Response("Interner Serverfehler", { 
      status: 500,
      headers: { "Content-Type": "text/plain" }
    });
  },
});

Custom Error Classes

Erstellen Sie benutzerdefinierte Fehlerklassen für spezifische Fehlerszenarien:

ts
class NotFoundError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "NotFoundError";
  }
}

class ValidationError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "ValidationError";
  }
}

Bun.serve({
  routes: {
    "/users/:id": async req => {
      const userId = req.params.id;
      
      if (!userId) {
        throw new ValidationError("Benutzer-ID ist erforderlich");
      }
      
      const user = await db.getUser(userId);
      
      if (!user) {
        throw new NotFoundError("Benutzer nicht gefunden");
      }
      
      return Response.json(user);
    },
  },
  error(error) {
    if (error instanceof NotFoundError) {
      return new Response(error.message, { status: 404 });
    }
    
    if (error instanceof ValidationError) {
      return new Response(error.message, { status: 400 });
    }
    
    console.error("Unbekannter Fehler:", error);
    return new Response("Interner Serverfehler", { status: 500 });
  },
});

Async Error Handling

Bei asynchronen Routen können Fehler mit .catch() oder try-catch behandelt werden:

ts
Bun.serve({
  routes: {
    "/data": async req => {
      return fetchData()
        .then(data => Response.json(data))
        .catch(error => {
          console.error("Fehler beim Abrufen der Daten:", error);
          return new Response("Daten konnten nicht abgerufen werden", { status: 500 });
        });
    },
  },
});

Error Middleware

Erstellen Sie Middleware-Funktionen zur zentralen Fehlerbehandlung:

ts
function errorHandler(fn: Function) {
  return async (req: Request) => {
    try {
      return await fn(req);
    } catch (error) {
      console.error("Middleware-Fehler:", error);
      return new Response("Fehler aufgetreten", { status: 500 });
    }
  };
}

Bun.serve({
  routes: {
    "/protected": errorHandler(async req => {
      // Geschützte Route
      const data = await getProtectedData();
      return Response.json(data);
    }),
  },
});

Bun von www.bunjs.com.cn bearbeitet