Hono — إطار العمل للويب على معايير الويب › مرجع الواجهة 7 / 8 السابق التالي

`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')
  //     ^?
  // ...
})

الحصول على قيمة ترويسة الطلب.

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')
  // ...
})

الأهداف المتاحة أدناه.

  • form
  • json
  • query
  • header
  • cookie
  • param

انظر قسم التحقق للاطلاع على أمثلة الاستخدام.

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()
    // ...
  }
)