Encodera

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

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

Оглавление

Группы маршрутов и отдельные файлы

Когда маршрутов становится много, 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. Внутри группы пишите адреса без префикса.

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

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