`HonoRequest`
الـ HonoRequest كائن يمكن أخذُه من c.req الذي يغلّف الطلب كائن.
param()
احصل على قيم معاملات المسار.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
// 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()
الحصول على معاملات سلسلة الاستعلام.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
// 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()
الحصول على قيم متعددة لوسيط في سلسلة الاستعلام، مثل /search?tags=A&tags=B
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/search', async (c) => {
// tags will be string[]
const tags = c.req.queries('tags')
// ^?
// ...
})
header()
الحصول على قيمة ترويسة الطلب.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/', (c) => {
const userAgent = c.req.header('User-Agent')
// ^?
return c.text(`Your user agent is ${userAgent}`)
})
عندما c.req.header() تُستدعى بدون وسائط، فإن جميع المفاتيح في السجل (record) المُرجَع تكون بأحرف صغيرة (lowercase).
إذا أردت الحصول على قيمة رأس (header) باسم بأحرف كبيرة (uppercase)،
استخدم 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()
تحليل جسم الطلب من نوع multipart/form-data أو application/x-www-form-urlencoded
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.parseBody()
// ...
})
parseBody() يدعم السلوكيات التالية.
ملف واحد
import { Context } from 'hono'
declare const c: Context
// ---cut---
const body = await c.req.parseBody()
const data = body['foo']
// ^?
body['foo'] هو (string | File).
إذا تم رفع عدة ملفات، فسيُستخدم الأخير.
ملفات متعددة
import { Context } from 'hono'
declare const c: Context
// ---cut---
const body = await c.req.parseBody()
body['foo[]']
body['foo[]'] دائمًا (string | File)[].
[] اللاحقة مطلوبة.
ملفات أو حقول متعددة بالاسم نفسه
إذا كان لديك حقل إدخال يسمح بعدة <input type="file" multiple /> أو عدة مربعات اختيار بنفس الاسم <input type="checkbox" name="favorites" value="Hono"/>.
import { Context } from 'hono'
declare const c: Context
// ---cut---
const body = await c.req.parseBody({ all: true })
body['foo']
all الخيار معطّل افتراضيًا.
- إذا
body['foo']ملفات متعددة، فستُحلَّل إلى(string | File)[]. - إذا
body['foo']ملف واحد، فسيُحلَّل إلى(string | File).
الترميز النقطي
إذا قمت بضبط dot خيار true، تُبنى القيمة المُعادة بناءً على تدوين النقطة (dot notation).
تخيّل استلام البيانات التالية:
const data = new FormData()
data.append('obj.key1', 'value1')
data.append('obj.key2', 'value2')
يمكنك الحصول على القيمة المُهيكَلة بتعيين dot خيار true:
import { Context } from 'hono'
declare const c: Context
// ---cut---
const body = await c.req.parseBody({ dot: true })
// body is `{ obj: { key1: 'value1', key2: 'value2' } }`
json()
يحلّل جسم الطلب من نوع application/json
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.json()
// ...
})
text()
يحلّل جسم الطلب من نوع text/plain
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.text()
// ...
})
arrayBuffer()
يحلل جسم الطلب كـ ArrayBuffer
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.arrayBuffer()
// ...
})
blob()
يحلل جسم الطلب كـ Blob.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.blob()
// ...
})
formData()
يحلل جسم الطلب كـ FormData.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.post('/entry', async (c) => {
const body = await c.req.formData()
// ...
})
valid()
احصل على البيانات المُتحقَّق منها.
app.post('/posts', async (c) => {
const { title, body } = c.req.valid('form')
// ...
})
الأهداف المتاحة أدناه.
formjsonqueryheadercookieparam
انظر قسم التحقق للاطلاع على أمثلة الاستخدام.
routePath
مهجور في v4.8.0: هذه الخاصية مهجورة. استخدم routePath() من مساعد Route بدلاً من ذلك.
يمكنك استرجاع المسار المُسجَّل داخل المعالج (handler) على النحو التالي:
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/posts/:id', (c) => {
return c.json({ path: c.req.routePath })
})
إذا وصلت إلى /posts/123، سيعيد /posts/:id:
{ "path": "/posts/:id" }
matchedRoutes
مهجور في v4.8.0: هذه الخاصية مهجورة. استخدم matchedRoutes() من مساعد Route بدلاً من ذلك.
يعيد المسارات المتطابقة داخل المعالج (handler)، وهو أمر مفيد لتصحيح الأخطاء (debugging).
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
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
مسار الطلب.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/about/me', async (c) => {
const pathname = c.req.path // `/about/me`
// ...
})
url
سلاسل عنوان URL للطلب.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/about/me', async (c) => {
const url = c.req.url // `http://localhost:8787/about/me`
// ...
})
method
اسم طريقة الطلب.
import { Hono } from 'hono'
const app = new Hono()
// ---cut---
app.get('/about/me', async (c) => {
const method = c.req.method // `GET`
// ...
})
raw
الخام Request كائن.
// For Cloudflare Workers
app.post('/', async (c) => {
const metadata = c.req.raw.cf?.hostMetadata?
// ...
})
cloneRawRequest()
يستنسخ كائن Request الخام من HonoRequest. يعمل حتى بعد استهلاك نص الطلب بواسطة أدوات التحقق أو طرق HonoRequest.
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()
// ...
}
)