README.md 4.7 KB

@e22m4u/js-trie-router-data-mapper

Парсинг и валидация данных для @e22m4u/js-trie-router.

Установка

npm install @e22m4u/js-trie-router-data-mapper

Модуль поддерживает ESM и CommonJS стандарты.

ESM

import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';

CommonJS

const {TrieRouterDataMapper} = require('@e22m4u/js-trie-router-data-mapper');

Использование

Подключение модуля к маршрутизатору.

import {TrieRouter} from '@e22m4u/js-trie-router';
import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';

const router = new TrieRouter();
router.useService(TrieRouterDataMapper);

Пример парсинга Query-параметра.

router.defineRoute({
  method: HttpMethod.GET,
  path: '/parseQuery',
  meta: {
    // в метаданных маршрута определяется набор свойств, которые
    // будут переданы в состояние текущего запроса "ctx.state",
    // свойства будут содержать данные согласно указанной схеме
    dataMap: {  // определение схемы данных
      filter: { // свойство "filter" будет добавлено в "ctx.state"
        source: HttpData.REQUEST_QUERY, // источник данных
        property: 'filter',       // извлечь свойство (опционально)
        schema: {                 // схема для парсинга и валидации
          type: DataType.OBJECT,  // разобрать значение как объект
          required: true,         // в противном случае выбросить ошибку
        },
        // подробнее о схеме данных (параметр "schema")
        // см. модуль @e22m4u/js-data-schema
      },
    },
  },
  handler: ({state: {filter}}) => {
    // для запроса GET /parseQuery?filter={"foo":"bar"}
    // значение параметра "filter" будет следующим:
    console.log(typeof filter); // "object"
    console.log(filter);        // {foo: 'bar'}
    // если значение разобрать не удалось,
    // то будет выброшена ошибка 
    return filter;
  },
});

Список источников данных.

export const HttpData = {
  REQUEST_PARAMS: 'requestParams',
  REQUEST_QUERY: 'requestQuery',
  REQUEST_HEADERS: 'requestHeaders',
  REQUEST_COOKIES: 'requestCookies',
  REQUEST_BODY: 'requestBody',
  RESPONSE_BODY: 'responseBody',
};

Описание параметров dataMap (метаданные маршрута).

  • source: HttpData источник данных;
  • property?: string извлечение указанного свойства;
  • schema?: DataSchema схема для парсинга и валидации;
  • projection?: DataProjection схема проекции данных;

Пример проекции ответа.

router.defineRoute({
  method: HttpMethod.GET,
  path: '/responseProjection',
  meta: {
    dataMap: { // определение карты данных
      response: {
        // свойство "response" не будет добавлено в "ctx.state",
        // так как в данном случае источником выступает ответ
        // сервера, а не входящие данные
        source: HttpData.RESPONSE_BODY, // источник данных
        projection: {foo: true, bar: false}, // схема проекции
        // подробнее о схеме проекции (параметр "projection")
        // см. модуль @e22m4u/js-data-projector
      },
    },
  },
  handler: () => {
    return {
      foo: 10, // доступно, явное правило
      bar: 20, // исключено, явное правило
      baz: 30, // исключено, отсутствует в схеме проекции
    };
  },
});
// для запроса GET /responseProjection
// ответ будет {"foo":10}

Структура схемы данных и схемы проекции.

Тесты

npm run test

Лицензия

MIT