|
@@ -8,6 +8,7 @@
|
|
|
- [Установка](#установка)
|
|
- [Установка](#установка)
|
|
|
- [Описание](#описание)
|
|
- [Описание](#описание)
|
|
|
- [Использование](#использование)
|
|
- [Использование](#использование)
|
|
|
|
|
+- [Примеры](#примеры)
|
|
|
- [Тесты](#тесты)
|
|
- [Тесты](#тесты)
|
|
|
- [Лицензия](#лицензия)
|
|
- [Лицензия](#лицензия)
|
|
|
|
|
|
|
@@ -43,7 +44,24 @@ const {TrieRouterDataMapper} = require('@e22m4u/js-trie-router-data-mapper');
|
|
|
- Схема данных [@e22m4u/js-data-schema](https://www.npmjs.com/package/@e22m4u/js-data-schema)
|
|
- Схема данных [@e22m4u/js-data-schema](https://www.npmjs.com/package/@e22m4u/js-data-schema)
|
|
|
- Схема проекции [@e22m4u/js-data-projector](https://www.npmjs.com/package/@e22m4u/js-data-projector)
|
|
- Схема проекции [@e22m4u/js-data-projector](https://www.npmjs.com/package/@e22m4u/js-data-projector)
|
|
|
|
|
|
|
|
-Разметка определяется в метаданных маршрута.
|
|
|
|
|
|
|
+## Использование
|
|
|
|
|
+
|
|
|
|
|
+Для корректной работы требуется выполнить подключение модуля к маршрутизатору.
|
|
|
|
|
+В этот момент будут зарегистрированы два глобальных хука. Первый хук выполняется
|
|
|
|
|
+перед основным обработчиком маршрута и разбирает входящие данные, а второй
|
|
|
|
|
+фильтрует ответ сервера.
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
|
|
|
+import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';
|
|
|
|
|
+
|
|
|
|
|
+const router = new TrieRouter();
|
|
|
|
|
+router.useService(TrieRouterDataMapper);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Разметка данных задается в свойстве `dataMapper` метаданных маршрута. Ключи
|
|
|
|
|
+этого объекта определяют имена полей, добавляемых в контекст запроса, а значения
|
|
|
|
|
+описывают правила извлечения, валидации и проекции для каждого источника данных.
|
|
|
|
|
|
|
|
```js
|
|
```js
|
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|
|
@@ -53,7 +71,6 @@ router.defineRoute({
|
|
|
method: HttpMethod.POST,
|
|
method: HttpMethod.POST,
|
|
|
path: '/createUser',
|
|
path: '/createUser',
|
|
|
meta: {
|
|
meta: {
|
|
|
- // разметка данных
|
|
|
|
|
dataMapper: {
|
|
dataMapper: {
|
|
|
userData: { // свойство "userData" будет добавлено в "ctx.state"
|
|
userData: { // свойство "userData" будет добавлено в "ctx.state"
|
|
|
source: HttpData.REQUEST_BODY, // источник данных
|
|
source: HttpData.REQUEST_BODY, // источник данных
|
|
@@ -93,40 +110,28 @@ export const HttpData = {
|
|
|
|
|
|
|
|
```js
|
|
```js
|
|
|
export const DataType = {
|
|
export const DataType = {
|
|
|
- ANY: "any",
|
|
|
|
|
- STRING: "string",
|
|
|
|
|
- NUMBER: "number",
|
|
|
|
|
- BOOLEAN: "boolean",
|
|
|
|
|
- ARRAY: "array",
|
|
|
|
|
- OBJECT: "object",
|
|
|
|
|
|
|
+ ANY: 'any',
|
|
|
|
|
+ STRING: 'string',
|
|
|
|
|
+ NUMBER: 'number',
|
|
|
|
|
+ BOOLEAN: 'boolean',
|
|
|
|
|
+ ARRAY: 'array',
|
|
|
|
|
+ OBJECT: 'object',
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-## Использование
|
|
|
|
|
-
|
|
|
|
|
-Подключение модуля к маршрутизатору.
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-import {TrieRouter} from '@e22m4u/js-trie-router';
|
|
|
|
|
-import {TrieRouterDataMapper} from '@e22m4u/js-trie-router-data-mapper';
|
|
|
|
|
-
|
|
|
|
|
-const router = new TrieRouter();
|
|
|
|
|
-router.useService(TrieRouterDataMapper);
|
|
|
|
|
-```
|
|
|
|
|
|
|
+## Примеры
|
|
|
|
|
|
|
|
-Пример парсинга Query-параметра.
|
|
|
|
|
|
|
+Извлечение и разбор Query-параметра с JSON значением.
|
|
|
|
|
|
|
|
```js
|
|
```js
|
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|
|
|
import {HttpData, DataType} from '@e22m4u/js-trie-router-data-mapper';
|
|
import {HttpData, DataType} from '@e22m4u/js-trie-router-data-mapper';
|
|
|
|
|
|
|
|
|
|
+// GET /parseQuery?filter={"foo":"bar"}
|
|
|
router.defineRoute({
|
|
router.defineRoute({
|
|
|
method: HttpMethod.GET,
|
|
method: HttpMethod.GET,
|
|
|
path: '/parseQuery',
|
|
path: '/parseQuery',
|
|
|
meta: {
|
|
meta: {
|
|
|
- // в объекте "dataMapper" определяется набор свойств, которые
|
|
|
|
|
- // будут переданы в состояние текущего запроса "ctx.state",
|
|
|
|
|
- // свойства будут содержать данные согласно указанной схеме
|
|
|
|
|
dataMapper: {
|
|
dataMapper: {
|
|
|
filter: { // свойство "filter" будет добавлено в "ctx.state"
|
|
filter: { // свойство "filter" будет добавлено в "ctx.state"
|
|
|
source: HttpData.REQUEST_QUERY, // источник данных
|
|
source: HttpData.REQUEST_QUERY, // источник данных
|
|
@@ -152,7 +157,7 @@ router.defineRoute({
|
|
|
});
|
|
});
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Пример проекции ответа.
|
|
|
|
|
|
|
+Фильтрация свойств возвращаемого объекта согласно схеме проекции.
|
|
|
|
|
|
|
|
```js
|
|
```js
|
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|
|
import {HttpMethod} from '@e22m4u/js-trie-router';
|