Encodera

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

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

Оглавление

Первое приложение

Приложение 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 или задайте другой порт.

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

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