@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 {}
Використання
В залежності від того, чи є контролер одинаком чи ні, результат роботи інтерсептора можна отримати двома способами:
- Якщо контролер не є одинаком, результат можна отримати за допомогою токена
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);
}
}
- Якщо контролер є одинаком, результат можна отримати з контексту:
import { controller, route, SingletonRequestContext } from '@ditsmod/core';
@controller({ isSingleton: true })
export class SomeController {
@route('POST')
ok(ctx: SingletonRequestContext) {
ctx.sendJson(ctx.body);
}
}