Парсинг, валидация и проекция данных для @e22m4u/js-trie-router
|
|
2 weeks ago | |
|---|---|---|
| .husky | 2 weeks ago | |
| dist | 2 weeks ago | |
| examples | 2 weeks ago | |
| src | 2 weeks ago | |
| .c8rc | 2 weeks ago | |
| .commitlintrc | 2 weeks ago | |
| .editorconfig | 2 weeks ago | |
| .gitignore | 2 weeks ago | |
| .mocharc.json | 2 weeks ago | |
| .prettierrc | 2 weeks ago | |
| LICENSE | 2 weeks ago | |
| README.md | 2 weeks ago | |
| build-cjs.js | 2 weeks ago | |
| eslint.config.js | 2 weeks ago | |
| package.json | 2 weeks ago | |
| tsconfig.json | 2 weeks ago |
Парсинг, валидация и проекция данных для @e22m4u/js-trie-router.
Модуль позволяет определить разметку данных для маршрутизатора. На основе разметки выполняется автоматическое извлечение, парсинг, валидация и проекция данных HTTP-запроса и ответа сервера. Сформированные данные помещаются в контекст запроса или определяют структуру возвращаемого результата.
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: {
// в объекте "dataMap" определяется набор свойств, которые
// будут переданы в состояние текущего запроса "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}
Структура схемы данных и схемы проекции.
Определение объекта настроек при подключении модуля.
import {TrieRouter} from '@e22m4u/js-trie-router';
import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';
const router = new TrieRouter();
router.useService(TrieRouterDataMapper, {
// игнорировать опцию "schema"
// для источника HttpData.RESPONSE_BODY
ignoreResponseDataSchema: true,
});
npm run test
MIT