Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Параметры адреса и строка запроса

Часто адрес содержит данные: номер статьи в /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, как показано в уроке о проверке данных.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.