Перейти до основного вмісту

@ditsmod/body-parser

Цей модуль додає інтерсептор для парсінгу тіла запиту до усіх роутів, що мають HTTP-методи вказані у bodyParserConfig.acceptMethods, по-дефолту це:

  • POST
  • PUT
  • PATCH

Підтримуються наступні типи даних:

  • application/json
  • application/x-www-form-urlencoded
  • text/plain
  • text/html

Даний модуль не парсить тіло запиту при завантаженні файлів, для цього можете скористатись стороннім модулем @ts-stack/multiparty.

Встановлення

npm i @ditsmod/body-parser

Підключення

Щоб глобально підключити @ditsmod/body-parser, потрібно імпортувати та експортувати BodyParserModule в кореневому модулі:

import { rootModule } from '@ditsmod/core';
import { BodyParserModule } from '@ditsmod/body-parser';

@rootModule({
imports: [
BodyParserModule,
// ...
],
exports: [BodyParserModule]
})
export class AppModule {}

В такому разі будуть працювати дефолтні налаштування. Якщо ж вам потрібно змінити деякі опції, можете це зробити наступним чином:

import { rootModule } from '@ditsmod/core';
import { BodyParserModule } from '@ditsmod/body-parser';

const moduleWithBodyParserConfig = BodyParserModule.withParams({ maxBodySize: 1024 * 1024 });

@rootModule({
imports: [
moduleWithBodyParserConfig,
// ...
],
exports: [moduleWithBodyParserConfig]
})
export class AppModule {}

Ще один варіант передачі конфігурації:

import { rootModule, Providers } from '@ditsmod/core';
import { BodyParserModule, BodyParserConfig } from '@ditsmod/body-parser';

@rootModule({
imports: [
BodyParserModule,
// ...
],
providersPerApp: [
...new Providers()
.useValue<BodyParserConfig>(BodyParserConfig, { maxBodySize: 1024*1024 })
],
exports: [BodyParserModule]
})
export class AppModule {}

Використання

В залежності від того, чи є контролер одинаком чи ні, результат роботи інтерсептора можна отримати двома способами:

  1. Якщо контролер не є одинаком, результат можна отримати за допомогою токена HTTP_BODY:
import { controller, Res, route, inject } from '@ditsmod/core';
import { HTTP_BODY } from '@ditsmod/body-parser';

interface Body {
one: number;
}

@controller()
export class SomeController {
@route('POST')
ok(@inject(HTTP_BODY) body: Body, res: Res) {
res.sendJson(body);
}
}
  1. Якщо контролер є одинаком, результат можна отримати з контексту:
import { controller, route, SingletonRequestContext } from '@ditsmod/core';

@controller({ isSingleton: true })
export class SomeController {
@route('POST')
ok(ctx: SingletonRequestContext) {
ctx.sendJson(ctx.body);
}
}