Appearance
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')
// ...
})header()
获取请求标头值。
🌐 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-data 或 application/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.
formjsonqueryheadercookieparam
请参见验证部分了解使用示例。
🌐 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 Helper 的 matchedRoutes()。
它在处理程序中返回匹配的路由,这对于调试很有用。
🌐 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()
// ...
}
)