Объект 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.method | HTTP-метод |
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 из урока о страницах: он экранирует значения сам.