Encodera

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

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

Оглавление

Маршруты и HTTP-методы

Маршрут — правило «метод + адрес → функция». Когда приходит запрос, Hono ищет маршрут с подходящим методом и адресом и вызывает его обработчик. Если маршрута нет, Hono сам отвечает кодом 404.

Простой маршрут

Маршруты добавляют в src/index.ts, до вызова serve():

// src/index.ts
app.get('/about', (c) => c.text('Блог о программировании'))

Откройте http://localhost:3000/about — на странице появится строка «Блог о программировании». Адрес /contacts вернёт текст 404 Not Found.

HTTP-методы

У каждого HTTP-метода свой метод приложения. Один адрес может по-разному отвечать на разные методы:

// src/index.ts
app.get('/posts', (c) => c.text('Список статей'))
app.post('/posts', (c) => c.text('Статья создана', 201))
app.put('/posts/1', (c) => c.text('Статья 1 изменена'))
app.patch('/posts/1', (c) => c.text('Статья 1 частично изменена'))
app.delete('/posts/1', (c) => c.text('Статья 1 удалена'))

Второй аргумент c.text() — код ответа. Браузер по ссылке всегда отправляет GET, поэтому остальные методы проверяют через curl:

curl -X POST http://localhost:3000/posts
curl -X DELETE http://localhost:3000/posts/1

В терминале появятся «Статья создана» и «Статья 1 удалена».

МетодДля чего
GETполучить данные
POSTсоздать запись
PUTзаменить запись целиком
PATCHизменить часть полей
DELETEудалить запись

Несколько методов сразу

app.all() срабатывает на любой метод, а app.on() принимает список методов:

// src/index.ts
app.on(['PUT', 'PATCH'], '/posts/2', (c) => c.text('Статья 2 изменена'))
app.all('/ping', (c) => c.text('pong'))

/ping ответит «pong» и на GET, и на POST, и на любой другой метод.

Цепочка методов

Методы маршрутов возвращают приложение, поэтому маршруты одного адреса можно записать цепочкой:

// src/index.ts
app
  .get('/comments', (c) => c.text('Все комментарии'))
  .post('/comments', (c) => c.text('Комментарий добавлен', 201))

Позже, в уроке об RPC-клиенте, такая запись понадобится для передачи типов.

Звёздочка

Символ * совпадает с любым продолжением адреса:

// src/index.ts
app.get('/files/*', (c) => c.text('Какой-то файл'))

Подойдут и /files/a.txt, и /files/docs/b.pdf.

Частая ошибка

Hono проверяет маршруты в порядке добавления. Если один маршрут уже вернул ответ, следующие для этого запроса не вызываются:

// src/index.ts
app.get('/posts/*', (c) => c.text('Какая-то статья'))
app.get('/posts/new', (c) => c.text('Новая статья')) // никогда не сработает

Ставьте конкретные адреса выше общих.

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

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