@ditsmod/body-parser
У цьому модулі зроблена інтеграція з @ts-stack/body-parser та @ts-stack/multer. По-дефолту, підтримуються наступні формати даних:
application/json
application/x-www-form-urlencoded
text/plain
application/octet-stream
multipart/form-data
За перші чотири формати із цього списку відповідає пакет @ts-stack/body-parser
, за останій - @ts-stack/multer
, який використовується для завантаження файлів. І оскільки налаштування для завантаження файлів може сильно відрізнятись від роута до роута, відповідно - для завантаження файлів Ditsmod надає сервіс, що спрощує роботу з файлами, замість готових результатів.
Для парсингу перших чотирьох форматів, цей модуль додає інтерсептор до усіх роутів, що мають HTTP-методи вказані у bodyParserConfig.acceptMethods
, по-дефолту це:
POST
PUT
PATCH
Готовий приклад використання @ditsmod/body-parser
можете проглянути в репозиторії Ditsmod.
Встановлення
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({
acceptMethods: ['POST'],
jsonOptions: { limit: '500kb', strict: false },
urlencodedOptions: { extended: true },
});
@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, { acceptMethods: ['POST'] }),
exports: [BodyParserModule]
})
export class AppModule {}
Отримання тіла запиту
В залежності від того, чи працює контролер в context-scoped, чи injector-scoped режимі, результат роботи інтерсептора можна отримати двома способами:
- Якщо контролер працює в режимі injector-scoped, результат можна отримати за допомогою токена
HTTP_BODY
:
import { controller, Res, inject } from '@ditsmod/core';
import { route } from '@ditsmod/routing';
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);
}
}
- Якщо контролер працює в режимі context-scoped, результат можна отримати з контексту:
import { controller, RequestContext } from '@ditsmod/core';
import { route } from '@ditsmod/routing';
@controller({ scope: 'ctx' })
export class SomeController {
@route('POST')
ok(ctx: RequestContext) {
ctx.sendJson(ctx.body);
}
}
Вимкнення парсера тіла запиту
Звичайно ж, перше, що можна зробити щоб перестав працювати парсер тіла запиту, це - не імпортувати у ваш модуль @ditsmod/body-parser
глобально чи локально. Також ви можете вимкнути парсер для конкретного контролера наступним чином:
import { controller } from '@ditsmod/core';
import { BodyParserConfig } from '@ditsmod/body-parser';
@controller({
providersPerRou: [
{ token: BodyParserConfig, useValue: { acceptMethods: [] } }
],
})
export class SomeController {
// ...
}
Тобто, таким чином ви передаєте пустий масив, замість дефолтного масиву ['POST', 'PUT', 'PATCH']
.