HonoRequest
HonoRequest ist ein über c.req abrufbares Objekt, das ein Request-Objekt umschließt.
param()
Liest die Werte der Pfadparameter.
// Captured params
app.get('/entry/:id', async (c) => {
const id = c.req.param('id')
// ...
})
// Get all params at once
app.get('/entry/:id/comment/:commentId', async (c) => {
const { id, commentId } = c.req.param()
})query()
Liest die Parameter der Abfragezeichenfolge.
// Query params
app.get('/search', async (c) => {
const query = c.req.query('q')
})
// Get all params at once
app.get('/search', async (c) => {
const { q, limit, offset } = c.req.query()
})queries()
Liest mehrere Werte eines Abfrageparameters, beispielsweise /search?tags=A&tags=B.
app.get('/search', async (c) => {
// tags will be string[]
const tags = c.req.queries('tags')
// ...
})header()
Liest den Wert eines Anfrageheaders.
app.get('/', (c) => {
const userAgent = c.req.header('User-Agent')
return c.text(`Your user agent is ${userAgent}`)
})Achtung
Wenn du c.req.header() ohne Argumente aufrufst, sind alle Schlüssel im zurückgegebenen Objekt kleingeschrieben.
Um einen Header mit Großbuchstaben im Namen abzurufen, verwende c.req.header(“X-Foo”).
// ❌ Will not work
const headerRecord = c.req.header()
const foo = headerRecord['X-Foo']
// ✅ Will work
const foo = c.req.header('X-Foo')parseBody()
Verarbeitet den Anfragebody vom Typ multipart/form-data oder application/x-www-form-urlencoded.
app.post('/entry', async (c) => {
const body = await c.req.parseBody()
// ...
})parseBody() unterstützt das folgende Verhalten.
Eine einzelne Datei
const body = await c.req.parseBody()
const data = body['foo']
body['foo'] hat den Typ (string | File).
Wenn mehrere Dateien hochgeladen werden, wird die letzte verwendet.
Mehrere Dateien
const body = await c.req.parseBody()
body['foo[]']body['foo[]'] hat immer den Typ (string | File)[].
Das Suffix [] ist erforderlich.
Mehrere Dateien oder Felder mit demselben Namen
Wenn ein Eingabefeld mehrere Dateien erlaubt (<input type="file" multiple />) oder mehrere Kontrollkästchen denselben Namen haben (<input type="checkbox" name="favorites" value="Hono"/>), kannst du Folgendes verwenden.
const body = await c.req.parseBody({ all: true })
body['foo']Die Option all ist standardmäßig deaktiviert.
- Wenn
body['foo']mehrere Dateien enthält, wird es als(string | File)[]verarbeitet. - Wenn
body['foo']eine einzelne Datei enthält, wird es als(string | File)verarbeitet.
Punktnotation
Wenn du die Option dot auf true setzt, wird der Rückgabewert anhand der Punktnotation strukturiert.
Angenommen, du erhältst folgende Daten:
const data = new FormData()
data.append('obj.key1', 'value1')
data.append('obj.key2', 'value2')Mit der Option dot auf true erhältst du den strukturierten Wert:
const body = await c.req.parseBody({ dot: true })
// body is `{ obj: { key1: 'value1', key2: 'value2' } }`json()
Verarbeitet den Anfragebody vom Typ application/json.
app.post('/entry', async (c) => {
const body = await c.req.json()
// ...
})text()
Verarbeitet den Anfragebody vom Typ text/plain.
app.post('/entry', async (c) => {
const body = await c.req.text()
// ...
})arrayBuffer()
Verarbeitet den Anfragebody als ArrayBuffer.
app.post('/entry', async (c) => {
const body = await c.req.arrayBuffer()
// ...
})blob()
Verarbeitet den Anfragebody als Blob.
app.post('/entry', async (c) => {
const body = await c.req.blob()
// ...
})formData()
Verarbeitet den Anfragebody als FormData.
app.post('/entry', async (c) => {
const body = await c.req.formData()
// ...
})valid()
Liest die validierten Daten.
app.post('/posts', async (c) => {
const { title, body } = c.req.valid('form')
// ...
})Die folgenden Ziele stehen zur Verfügung.
formjsonqueryheadercookieparam
Anwendungsbeispiele findest du im Abschnitt zur Validierung.
routePath
Achtung
Seit v4.8.0 veraltet: Diese Eigenschaft ist veraltet. Verwende stattdessen routePath() aus dem Route-Helper.
Im Handler kannst du den registrierten Pfad so abrufen:
app.get('/posts/:id', (c) => {
return c.json({ path: c.req.routePath })
})Beim Zugriff auf /posts/123 wird /posts/:id zurückgegeben:
{ "path": "/posts/:id" }matchedRoutes
Achtung
Seit v4.8.0 veraltet: Diese Eigenschaft ist veraltet. Verwende stattdessen matchedRoutes() aus dem Route-Helper.
Gibt die übereinstimmenden Routen innerhalb des Handlers zurück. Das ist beim Debuggen hilfreich.
app.use(async function logger(c, next) {
await next()
c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {
const name =
handler.name ||
(handler.length < 2 ? '[handler]' : '[middleware]')
console.log(
method,
' ',
path,
' '.repeat(Math.max(10 - path.length, 0)),
name,
i === c.req.routeIndex ? '<- respond from here' : ''
)
})
})path
Der Pfadname der Anfrage.
app.get('/about/me', async (c) => {
const pathname = c.req.path // `/about/me`
// ...
})url
Die URL-Zeichenfolge der Anfrage.
app.get('/about/me', async (c) => {
const url = c.req.url // `http://localhost:8787/about/me`
// ...
})method
Der Methodenname der Anfrage.
app.get('/about/me', async (c) => {
const method = c.req.method // `GET`
// ...
})raw
Das ursprüngliche Request-Objekt.
// For Cloudflare Workers
app.post('/', async (c) => {
const metadata = c.req.raw.cf?.hostMetadata?
// ...
})cloneRawRequest()
Klont das ursprüngliche Request-Objekt aus einer HonoRequest. Das funktioniert auch, wenn der Anfragebody bereits von Validatoren oder HonoRequest-Methoden gelesen wurde.
import { Hono } from 'hono'
const app = new Hono()
import { cloneRawRequest } from 'hono/request'
import { validator } from 'hono/validator'
app.post(
'/forward',
validator('json', (data) => data),
async (c) => {
// Clone after validation
const clonedReq = await cloneRawRequest(c.req)
// Does not throw the error
await clonedReq.json()
// ...
}
)