Парсинг, валидация и проекция данных для @e22m4u/js-trie-router

e22m4u d61ae0e3f3 docs: updates REAMDE.md 1 week ago
.husky c5bb05693b chore: initial commit 2 weeks ago
dist a2c718b2ca chore: updates dependencies 1 week ago
examples a2c718b2ca chore: updates dependencies 1 week ago
src a2c718b2ca chore: updates dependencies 1 week ago
.c8rc c5bb05693b chore: initial commit 2 weeks ago
.commitlintrc c5bb05693b chore: initial commit 2 weeks ago
.editorconfig c5bb05693b chore: initial commit 2 weeks ago
.gitignore c5bb05693b chore: initial commit 2 weeks ago
.mocharc.json c5bb05693b chore: initial commit 2 weeks ago
.prettierrc c5bb05693b chore: initial commit 2 weeks ago
LICENSE c5bb05693b chore: initial commit 2 weeks ago
README.md d61ae0e3f3 docs: updates REAMDE.md 1 week ago
build-cjs.js c5bb05693b chore: initial commit 2 weeks ago
eslint.config.js a2c718b2ca chore: updates dependencies 1 week ago
package.json fe81f9dba1 chore: bumps version to 0.1.0 1 week ago
tsconfig.json c5bb05693b chore: initial commit 2 weeks ago

README.md

@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');

Описание

Модуль позволяет определить разметку данных маршрута. На основе разметки выполняется автоматический парсинг, валидация и проекция данных HTTP-запроса и ответа сервера. Сформированные данные помещаются в контекст запроса или определяют структуру возвращаемого ответа.

Используется синтаксис указанных ниже модулей (не требуют установки).

Разметка определяется в метаданных маршрута.

import {HttpMethod} from '@e22m4u/js-trie-router';
import {HttpData, DataType} from '@e22m4u/js-trie-router-data-mapper';

router.defineRoute({
  method: HttpMethod.POST,
  path: '/createUser',
  meta: {
    // разметка данных
    dataMapper: {
      userData: { // свойство "userData" будет добавлено в "ctx.state"
        source: HttpData.REQUEST_BODY, // источник данных
        schema: DataType.OBJECT,       // тип или схема данных
        // property: ...   (извлечь свойство из источника)
        // projection: ... (схема проекции)
      },
    },
  },
  handler: ({state: {userData}}) => {
    // ...
  },
});

Параметры разметки (метаданные маршрута).

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

Константы источников данных (параметр source).

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

Константы типов данных (подробнее @e22m4u/js-data-schema).

export const DataType = {
  ANY: "any",
  STRING: "string",
  NUMBER: "number",
  BOOLEAN: "boolean",
  ARRAY: "array",
  OBJECT: "object",
}

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

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

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

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

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

import {HttpMethod} from '@e22m4u/js-trie-router';
import {HttpData, DataType} from '@e22m4u/js-trie-router-data-mapper';

router.defineRoute({
  method: HttpMethod.GET,
  path: '/parseQuery',
  meta: {
    // в объекте "dataMapper" определяется набор свойств, которые
    // будут переданы в состояние текущего запроса "ctx.state",
    // свойства будут содержать данные согласно указанной схеме
    dataMapper: {
      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;
  },
});

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

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

router.defineRoute({
  method: HttpMethod.GET,
  path: '/responseProjection',
  meta: {
    dataMapper: {
      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