Перейти к содержимому

Маршрутизация

В целом, маршрутизация в 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)