HTTPException
Bei einem schwerwiegenden Fehler können Hono und viele Middleware-Komponenten des Ökosystems eine HTTPException auslösen. Dies ist ein eigener Error von Hono, der das Zurückgeben von Fehlerantworten vereinfacht.
HTTPExceptions auslösen
Du kannst eigene HTTPExceptions auslösen, indem du einen Statuscode und entweder eine Nachricht oder eine eigene Antwort angibst.
Eigene Nachricht
Für einfache text-Antworten genügt es, die message des Fehlers festzulegen.
import { HTTPException } from 'hono/http-exception'
throw new HTTPException(401, { message: 'Unauthorized' })Eigene Antwort
Für andere Antworttypen oder zum Setzen von Antwortheadern verwende die Option res. Beachte, dass zum Erstellen der Antwort der Statuscode verwendet wird, den du dem Konstruktor übergibst.
import { HTTPException } from 'hono/http-exception'
const errorResponse = new Response('Unauthorized', {
status: 401, // this gets ignored
headers: {
Authenticate: 'error="invalid_token"',
},
})
throw new HTTPException(401, { res: errorResponse })Ursache
In beiden Fällen kannst du mit der Option cause beliebige Daten zur HTTPException hinzufügen.
app.post('/login', async (c) => {
try {
await authorize(c)
} catch (cause) {
throw new HTTPException(401, { message, cause })
}
return c.redirect('/')
})HTTPExceptions behandeln
Nicht abgefangene HTTPExceptions lassen sich mit app.onError behandeln. Sie stellen die Methode getResponse bereit, die aus dem status des Fehlers und entweder seiner message oder der beim Auslösen festgelegten eigenen Antwort eine neue Response erstellt und zurückgibt.
import { HTTPException } from 'hono/http-exception'
// ...
app.onError((err, c) => {
if (err instanceof HTTPException) {
// Return the error response generated by HTTPException
return err.getResponse()
}
// For any other unexpected errors, log and return a generic 500 response
console.error(err)
return c.text('Internal Server Error', 500)
})Achtung
HTTPException.getResponse berücksichtigt den Context nicht. Damit bereits im Context gesetzte Header enthalten sind, musst du sie auf eine neue Response übertragen.