Маршрутизация
В целом, маршрутизация в Lunatic’е выглядит следующим образом:
app.<метод>([путь], <обработчик>)
где
<метод>
— HTTP-метод запроса в нижнем регистре (get
,post
, …)[path]
— опциональный путь запроса (/
,/api
, …)<handler>
— обработчик для указанного маршрута
Обработчик запроса
Обработчик запроса (тип RequestHandler
) — это
функция, принимающая 3 аргумента:
req
:Request
— входящий HTTP-запросres
:Response
— HTTP-ответ сервераnext
:NextHandler
— следующий обработчик, который можно вызвать и «подождать» внутри текущего
Примеры
Здесь приведены простые примеры маршрутизации. Вы можете добавить их в свое первое приложение:
import { LunaticServer } from '@shelepuginivan/lunatic'
const app = new LunaticServer()
app.get('/', (req, res) => { res.status(200).json({ hello: 'lunatic' })})
app.post('/', (_req, res) => { res.status(200).json({ message: 'POST запрос' }) })
app.put('/', (_req, res) => { res.status(200).json({ message: 'PUT запрос' }) })
app.delete('/', (_req, res) => { res.status(200).json({ message: 'DELETE запрос' }) })
app.listen(8000).then(() => console.log('Сервер запущен на порту 8000...'))
Произвольные методы запросов
В дополнение к методам app.get
,
app.post
и т. д. вы можете использовать
app.use
для обработки всех методов запроса.
app.use('/route', (req, res, next) => { console.log('Можно обрабатывать запросы с любыми методами')
next() // вызов следующего обработчика})
Произвольные пути запросов
Параметр path
можно опустить. В этом случае функция-обработчик получает все
запросы с соответствующим методом:
// Установка заголовка X-Handle-Time для всех GET запросов.app.get((req, res, next) => { res.setHeader('X-Handle-Time', Date.now()) next()})
Динамические пути
Lunatic поддерживает динамические маршруты:
*
— соответствует всем путям (исключение составляет пустой путь, который является другой конечной точкой).:<param>
— соответствует одной части пути запроса...[params]
— аналогично*
, но также учитывает все параметры пути.
Доступ к параметрам пути можно получить с помощью
req.params
.
Ниже приведены примеры:
// Обрабатывает GET /:id// например, /1, /b9e5e951-cc0e-4d6d-b659-a28fc7a74362 и т. д.app.get('/:id', (req, res) => { const id = req.params.id // Получение id из параметров пути res.status(200).text(id)})
// Обрабатывает GET /...arr// например, /a/b/c/d, /a, /1/2 и т. д.app.get('/...arr', (req, res) => { res.status(200).json(req.params.arr)})
// Обрабатывает GET /admin/*// например, /admin/drop_database, /admin/sudo/rm_rf// но НЕ /admin, потому что `*` не совпадает с пустым путёмapp.get('/admin/*', (_req, res) => { res.status(501).end()})
Router
В дополнение к типу RequestHandler
(функция-обработчик, как в примерах выше), методы запросов могут принимать
Router
. Router
— это класс фреймворка Lunatic, который
действует аналогично базовому серверу
(LunaticServer
). В основном маршрутизаторы реализуют
субмаршрутизацию, которая может быть использована для декомпозиции приложений.
Например, могут быть отдельные маршрутизаторы для авторизации, API и т. д.
import { Router } from '@shelepuginivan/lunatic'
const myRouter = new Router()
myRouter.get('/', (_req, res) => { res.status(200).text('Привет из роутера')})
app.use('/router', router) // обрабатывает все запросы к /router с помощью созданного маршрутизатора
Также поддерживается вложенность:
const router = new Router()const innerRouter = new Router()
innerRouter.get('/some', (_req, res) => { res.status(200).json({ message: 'Привет из внутреннего роутера' })})
router.use('/inner', innerRouter)app.use('/router', router)