Группы маршрутов и отдельные файлы
Когда маршрутов становится много, src/index.ts превращается в длинный список. В Hono группу маршрутов оформляют как отдельное маленькое приложение new Hono() в своём файле, а главное приложение подключает его методом app.route() под общим префиксом адреса.
Файл с маршрутами статей
Создайте папку src/routes и в ней файл posts.ts:
// src/routes/posts.ts
import { Hono } from 'hono'
const posts = new Hono()
posts.get('/', (c) => c.text('Список статей'))
posts.get('/:id', (c) => c.text(`Статья ${c.req.param('id')}`))
posts.post('/', (c) => c.text('Статья создана', 201))
export default postsАдреса здесь записаны относительно будущего префикса: / — это сам список, /:id — одна статья.
Подключение
В src/index.ts импортируйте группу и подключите её:
// src/index.ts
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import posts from './routes/posts.js'
const app = new Hono()
app.route('/posts', posts)
serve({ fetch: app.fetch, port: 3000 })Теперь GET /posts вернёт «Список статей», а GET /posts/7 — «Статья 7». Расширение .js в импорте обязательно из-за настройки модулей NodeNext, хотя сам файл называется posts.ts.
Вложенные ресурсы
Комментарии принадлежат статье, поэтому их адрес начинается с номера статьи. Создайте src/routes/comments.ts:
// src/routes/comments.ts
import { Hono } from 'hono'
const comments = new Hono()
comments.get('/:postId/comments', (c) => {
return c.text(`Комментарии к статье ${c.req.param('postId')}`)
})
export default commentsИ подключите с тем же префиксом:
// src/index.ts
import comments from './routes/comments.js'
app.route('/posts', comments)Адрес /posts/3/comments вернёт «Комментарии к статье 3». Одному префиксу можно подключить несколько групп.
Общий префикс API
Если все адреса API должны начинаться с /api, задайте его один раз через basePath():
// src/index.ts
const app = new Hono().basePath('/api')
app.route('/posts', posts)
app.route('/posts', comments)Теперь список статей живёт по адресу /api/posts, а комментарии — /api/posts/3/comments.
Структура проекта
src/
├── index.ts приложение, подключение групп, запуск сервера
└── routes/
├── posts.ts
└── comments.tsДальше в курсе маршруты статей пишутся в src/routes/posts.ts.
Частая ошибка
В файле группы повторяют префикс:
// src/routes/posts.ts
posts.get('/posts/:id', (c) => c.text('Статья'))После app.route('/posts', posts) этот маршрут окажется по адресу /posts/posts/5, а /posts/5 вернёт 404. Внутри группы пишите адреса без префикса.