Первое приложение
Приложение Hono — объект, созданный через new Hono(). В него добавляют маршруты, а потом передают функцию app.fetch серверу. На Node.js сервер запускает функция serve() из пакета @hono/node-server.
Файл точки входа
После создания проекта файл src/index.ts выглядит так:
// src/index.ts
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => {
return c.text('Hello Hono!')
})
serve({
fetch: app.fetch,
port: 3000,
}, (info) => {
console.log(`Server is running on http://localhost:${info.port}`)
})Разберём по частям:
| Строка | Что делает |
|---|---|
new Hono() | создаёт приложение |
app.get('/', ...) | добавляет маршрут для GET-запроса на адрес / |
c | контекст — объект с запросом и методами для ответа |
c.text(...) | создаёт ответ с обычным текстом |
serve(...) | запускает HTTP-сервер Node.js и передаёт каждый запрос в app.fetch |
Второй аргумент serve() вызывается, когда сервер готов, и печатает адрес в терминал.
Первый JSON
Hono чаще используют для API, поэтому добавьте маршрут, который возвращает список статей блога:
// src/index.ts
const posts = [
{ id: 1, title: 'Первая статья', body: 'Привет, мир!' },
{ id: 2, title: 'Вторая статья', body: 'Учим Hono.' },
]
app.get('/posts', (c) => {
return c.json(posts)
})Вставьте этот код перед вызовом serve(). Метод c.json() превращает массив в строку JSON и сам ставит заголовок Content-Type: application/json. Откройте http://localhost:3000/posts — браузер покажет массив из двух статей.
Запрос из терминала
API удобно проверять командой curl:
curl http://localhost:3000/postsВ терминале появится тот же JSON. Флаг -i покажет ещё и заголовки ответа:
curl -i http://localhost:3000/postsПервая строка ответа — HTTP/1.1 200 OK, среди заголовков будет content-type: application/json.
Перезапуск при изменениях
Команда npm run dev следит за файлами. Измените текст в c.text(), сохраните файл и обновите страницу — новый текст появится без ручного перезапуска.
Порт
Порт задаётся в serve(). Чтобы его можно было менять без правки кода, берите его из переменной окружения:
// src/index.ts
const port = Number(process.env.PORT ?? 3000)
serve({ fetch: app.fetch, port })Подробнее о переменных окружения — в отдельном уроке.
Частая ошибка
npm run dev запускают второй раз в другом терминале, забыв про первый. Второй процесс падает с ошибкой EADDRINUSE: порт 3000 уже занят. Сервер должен работать в одном экземпляре — остановите лишний сочетанием Ctrl+C или задайте другой порт.