Маршруты и 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('Новая статья')) // никогда не сработаетСтавьте конкретные адреса выше общих.