Параметры адреса и строка запроса
Часто адрес содержит данные: номер статьи в /posts/5 или номер страницы в /posts?page=2. Первое называется параметром пути, второе — строкой запроса (query). Hono читает их методами c.req.param() и c.req.query().
Параметр пути
Параметр обозначается двоеточием в адресе маршрута:
// src/index.ts
app.get('/posts/:id', (c) => {
const id = c.req.param('id')
return c.text(`Статья номер ${id}`)
})Откройте http://localhost:3000/posts/5 — появится «Статья номер 5». Значение параметра всегда строка, даже если в адресе цифры.
Поиск статьи по номеру
Соединим параметр со списком статей из прошлого урока:
// src/index.ts
app.get('/posts/:id', (c) => {
const id = Number(c.req.param('id'))
const post = posts.find((p) => p.id === id)
if (!post) {
return c.json({ error: 'Статья не найдена' }, 404)
}
return c.json(post)
})/posts/1 вернёт первую статью, а /posts/99 — объект с ошибкой и код 404.
Несколько параметров
// src/index.ts
app.get('/posts/:postId/comments/:commentId', (c) => {
const { postId, commentId } = c.req.param()
return c.text(`Комментарий ${commentId} к статье ${postId}`)
})Без аргумента c.req.param() возвращает объект со всеми параметрами. TypeScript знает их имена по адресу маршрута и подскажет их в редакторе.
Ограничение параметра
После имени в фигурных скобках можно указать регулярное выражение:
// src/index.ts
app.get('/posts/:id{[0-9]+}', (c) => c.text(`Статья ${c.req.param('id')}`))/posts/12 подойдёт, а /posts/hello — нет, и Hono вернёт 404.
Строка запроса
Параметры после ? не описываются в маршруте, их читают в обработчике:
// src/index.ts
app.get('/search', (c) => {
const q = c.req.query('q') ?? ''
const page = Number(c.req.query('page') ?? 1)
return c.json({ q, page })
})Адрес /search?q=hono&page=2 вернёт {"q":"hono","page":2}. Если параметра нет, c.req.query() возвращает undefined, поэтому значение по умолчанию задаётся через ??.
| Метод | Результат для ?tag=js&tag=ts |
|---|---|
c.req.query('tag') | 'js' — первое значение |
c.req.queries('tag') | ['js', 'ts'] — все значения |
c.req.query() | объект со всеми параметрами |
Частая ошибка
Параметр сравнивают с числом без преобразования:
// src/index.ts
const post = posts.find((p) => p.id === c.req.param('id')) // всегда undefined'1' === 1 даёт false, и статья никогда не находится. TypeScript подчеркнёт такое сравнение, но в JavaScript-проекте ошибка останется незамеченной. Преобразуйте значение через Number() или проверяйте его схемой zod, как показано в уроке о проверке данных.