Encodera

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

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

Оглавление

Объект Context

Каждый обработчик получает один аргумент — контекст, его принято называть c. Контекст создаётся заново для каждого запроса и содержит всё нужное: сам запрос в c.req и методы, которые собирают ответ.

Данные запроса

c.req — обёртка над стандартным объектом Request с удобными методами:

// src/index.ts
app.get('/info', (c) => {
  return c.json({
    method: c.req.method,
    path: c.req.path,
    url: c.req.url,
    agent: c.req.header('User-Agent'),
  })
})

Откройте http://localhost:3000/info — в ответе будут метод GET, путь /info, полный адрес и строка с названием вашего браузера.

Свойство или методЧто возвращает
c.req.methodHTTP-метод
c.req.pathпуть без домена и без строки запроса
c.req.urlполный адрес
c.req.header('Имя')значение заголовка или undefined
c.req.param(), c.req.query()параметры адреса, разобраны в прошлом уроке
c.req.rawисходный объект Request

Методы ответа

Каждый метод создаёт объект Response, который обработчик возвращает:

МетодОтвет
c.text('Привет')обычный текст
c.json(данные)JSON
c.html('<h1>Блог</h1>')HTML-разметка
c.redirect('/posts')перенаправление на другой адрес
c.body(null, 204)ответ без готового формата, например пустой
c.notFound()ответ 404

Код ответа

Код передают вторым аргументом или задают заранее через c.status():

// src/index.ts
app.post('/posts', (c) => {
  c.status(201)
  return c.json({ message: 'Статья создана' })
})

Ответ придёт с кодом 201 Created. Запись c.json({ ... }, 201) делает то же самое.

Заголовки

c.header() добавляет заголовок к будущему ответу:

// src/index.ts
app.get('/posts', (c) => {
  c.header('X-Total-Count', String(posts.length))
  return c.json(posts)
})

Команда curl -i http://localhost:3000/posts покажет среди заголовков x-total-count: 2.

HTML и перенаправление

// src/index.ts
app.get('/', (c) => c.html('<h1>Блог</h1><p><a href="/posts">Статьи</a></p>'))
 
app.get('/blog', (c) => c.redirect('/'))

Главная страница покажет заголовок и ссылку, а адрес /blog перекинет браузер на /. По умолчанию c.redirect() отвечает кодом 302, постоянное перенаправление — c.redirect('/', 301).

Частая ошибка

В c.html() подставляют данные пользователя через обычный шаблон строки:

// src/index.ts
app.get('/hello', (c) => c.html(`<h1>Привет, ${c.req.query('name')}</h1>`))

Строка вставляется в страницу как есть. Если передать в name тег script, браузер выполнит чужой код. Для HTML с данными используйте JSX из урока о страницах: он экранирует значения сам.

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

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