Skip to content

HonoRequest

HonoRequest 是一个可以从 c.req 中获取的对象,c.req 封装了一个 Request 对象。

🌐 The HonoRequest is an object that can be taken from c.req which wraps a Request object.

param()

获取路径参数的值。

🌐 Get the values of path parameters.

ts
// 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()

获取查询字符串参数。

🌐 Get querystring parameters.

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

🌐 Get multiple querystring parameter values, e.g. /search?tags=A&tags=B

ts
app
.
get
('/search', async (
c
) => {
// tags will be string[] const
tags
=
c
.
req
.
queries
('tags')
// ... })

获取请求标头值。

🌐 Get the request header value.

ts
app
.
get
('/', (
c
) => {
const
userAgent
=
c
.
req
.
header
('User-Agent')
return
c
.
text
(`Your user agent is ${
userAgent
}`)
})

WARNING

c.req.header() 被调用且不带参数时,返回记录中的所有键都是小写

如果你想获取一个大写名称的头的值,使用 c.req.header(“X-Foo”)

🌐 If you want to get the value of a header with an uppercase name, use c.req.header(“X-Foo”).

ts
// ❌ 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-dataapplication/x-www-form-urlencoded 的请求体

🌐 Parse Request body of type multipart/form-data or application/x-www-form-urlencoded

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
parseBody
()
// ... })

parseBody() 支持以下行为。

单个文件

ts
const 
body
= await
c
.
req
.
parseBody
()
const
data
=
body
['foo']

body['foo'](string | File)

如果上传了多个文件,将使用最后一个文件。

🌐 If multiple files are uploaded, the last one will be used.

多个文件

🌐 Multiple files

ts
const 
body
= await
c
.
req
.
parseBody
()
body
['foo[]']

body['foo[]'] 总是 (string | File)[]

需要 [] 后缀。

多个同名文件或字段

🌐 Multiple files or fields with same name

如果你有一个允许多个 <input type="file" multiple /> 的输入字段,或者多个具有相同名称 <input type="checkbox" name="favorites" value="Hono"/> 的复选框。

🌐 If you have an input field that allows multiple <input type="file" multiple /> or multiple checkboxes with the same name <input type="checkbox" name="favorites" value="Hono"/>.

ts
const 
body
= await
c
.
req
.
parseBody
({
all
: true })
body
['foo']

all 选项默认被禁用。

  • 如果 body['foo'] 是多个文件,它将被解析为 (string | File)[]
  • 如果 body['foo'] 是单个文件,它将被解析为 (string | File)

点符号

🌐 Dot notation

如果你将 dot 选项设置为 true,则返回值将基于点符号进行结构化。

🌐 If you set the dot option true, the return value is structured based on the dot notation.

想象一下接收以下数据:

🌐 Imagine receiving the following data:

ts
const 
data
= new
FormData
()
data
.
append
('obj.key1', 'value1')
data
.
append
('obj.key2', 'value2')

你可以通过设置 dot 选项 true 来获取结构化值:

🌐 You can get the structured value by setting the dot option true:

ts
const 
body
= await
c
.
req
.
parseBody
({
dot
: true })
// body is `{ obj: { key1: 'value1', key2: 'value2' } }`

json()

解析类型为 application/json 的请求体

🌐 Parses the request body of type application/json

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
json
()
// ... })

text()

解析类型为 text/plain 的请求体

🌐 Parses the request body of type text/plain

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
text
()
// ... })

arrayBuffer()

将请求体解析为 ArrayBuffer

🌐 Parses the request body as an ArrayBuffer

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
arrayBuffer
()
// ... })

blob()

将请求体解析为 Blob

🌐 Parses the request body as a Blob.

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
blob
()
// ... })

formData()

将请求体解析为 FormData

🌐 Parses the request body as a FormData.

ts
app
.
post
('/entry', async (
c
) => {
const
body
= await
c
.
req
.
formData
()
// ... })

valid()

获取经过验证的数据。

🌐 Get the validated data.

ts
app.post('/posts', async (c) => {
  const { title, body } = c.req.valid('form')
  // ...
})

可用目标如下。

🌐 Available targets are below.

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

请参见验证部分了解使用示例。

🌐 See the Validation section for usage examples.

routePath

WARNING

在 v4.8.0 中弃用:此属性已弃用。请改用 Route Helper 中的 routePath()

你可以像这样在处理程序中检索已注册的路径:

🌐 You can retrieve the registered path within the handler like this:

ts
app
.
get
('/posts/:id', (
c
) => {
return
c
.
json
({
path
:
c
.
req
.
routePath
})
})

如果你访问 /posts/123,它将返回 /posts/:id

🌐 If you access /posts/123, it will return /posts/:id:

json
{ "path": "/posts/:id" }

matchedRoutes

WARNING

在 v4.8.0 中已弃用:此属性已被弃用。请改用来自 Route HelpermatchedRoutes()

它在处理程序中返回匹配的路由,这对于调试很有用。

🌐 It returns matched routes within the handler, which is useful for debugging.

ts
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

请求路径名。

🌐 The request pathname.

ts
app
.
get
('/about/me', async (
c
) => {
const
pathname
=
c
.
req
.
path
// `/about/me`
// ... })

url

请求 URL 字符串。

🌐 The request url strings.

ts
app
.
get
('/about/me', async (
c
) => {
const
url
=
c
.
req
.
url
// `http://localhost:8787/about/me`
// ... })

method

请求的方法名称。

🌐 The method name of the request.

ts
app
.
get
('/about/me', async (
c
) => {
const
method
=
c
.
req
.
method
// `GET`
// ... })

raw

原始 Request 对象。

🌐 The raw Request object.

ts
// For Cloudflare Workers
app.post('/', async (c) => {
  const metadata = c.req.raw.cf?.hostMetadata?
  // ...
})

cloneRawRequest()

从 HonoRequest 克隆原始请求对象。即使请求体已被验证器或 HonoRequest 方法使用后,也能正常工作。

🌐 Clones the raw Request object from a HonoRequest. Works even after the request body has been consumed by validators or HonoRequest methods.

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

Hono 中文网 - 粤ICP备13048890号