Zum Inhalt springen

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.

ts
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.

ts
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.

ts
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.

ts
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.

Veröffentlicht unter der MIT-Lizenz.