@ditsmod/body-parser
У цьому модулі зроблена інтеграція з @ts-stack/body-parser та @ts-stack/multer. По-дефолту, підтримуються наступні формати даних:
application/jsonapplication/x-www-form-urlencodedtext/plainapplication/octet-streammultipart/form-data
За перші чотири формати із цього списку відповідає пакет @ts-stack/body-parser, за останій - @ts-stack/multer, який використовується для завантаження файлів. І оскільки налаштування для завантаження файлів може сильно відрізнятись від роута до роута, відповідно - для завантаження файлів Ditsmod надає сервіс, що спрощує роботу з файлами, замість готових результатів.
Для парсингу перших чотирьох форматів, цей модуль додає інтерсептор до усіх роутів, що мають HTTP-методи вказані у bodyParserConfig.acceptMethods, по-дефолту це:
POSTPUTPATCH
Готовий приклад використання @ditsmod/body-parser можете проглянути в репозиторії Ditsmod.
Встановлення
npm i @ditsmod/body-parser
Підключення
Щоб глобально підключити @ditsmod/body-parser, потрібно імпортувати та експортувати BodyParserModule в кореневому модулі:
import { restRootModule } from '@ditsmod/rest';
import { BodyParserModule } from '@ditsmod/body-parser';
@restRootModule({
imports: [
BodyParserModule,
// ...
],
exports: [BodyParserModule],
})
export class AppModule {}
В такому разі будуть працювати дефолтні налаштування. Якщо ж вам потрібно змінити деякі опції, можете це зробити наступним чином:
import { restRootModule } from '@ditsmod/rest';
import { BodyParserModule } from '@ditsmod/body-parser';
const moduleWithBodyParserConfig = BodyParserModule.withParams({
acceptMethods: ['POST'],
jsonOptions: { limit: '500kb', strict: false },
urlencodedOptions: { extended: true },
});
@restRootModule({
imports: [
moduleWithBodyParserConfig,
// ...
],
exports: [moduleWithBodyParserConfig],
})
export class AppModule {}
Ще один варіант передачі конфігурації:
import { restRootModule } from '@ditsmod/rest';
import { BodyParserModule, BodyParserConfig } from '@ditsmod/body-parser';
@restRootModule({
imports: [
BodyParserModule,
// ...
],
providersPerApp: [
{ token: BodyParserConfig, useValue: { acceptMethods: ['POST'] } }
],
exports: [BodyParserModule],
})
export class AppModule {}
Отримання тіла запиту
В залежності від того, чи працює контролер в route-scoped, чи request-scoped режимі, результат роботи інтерсептора можна отримати двома способами:
- Якщо контролер працює в режимі request-scoped, результат можна отримати за допомогою токена
HTTP_BODY:
import { ctx } from '@ditsmod/core';
import { controller, RequestContext, route } from '@ditsmod/rest';
import { HTTP_BODY } from '@ditsmod/body-parser';
interface Body {
one: number;
}
@controller()
export class SomeController {
@route('POST')
ok(@ctx(HTTP_BODY) body: Body) {
return body;
}
}
- Якщо контролер працює в режимі route-scoped, результат можна отримати з контексту:
import { controller, RequestContext, route } from '@ditsmod/rest';
@controller({ scope: 'route' })
export class SomeController {
@route('POST')
ok(ctx: RequestContext) {
return ctx.body;
}
}