@ditsmod/cors
Якщо ваш застосунок потребує використання HTTP-методу OPTIONS чи механізмів CORS або preflight CORS, можна використовувати модуль @ditsmod/cors
.
Встановлення
npm i @ditsmod/cors
Робота з дефолтними налаштуваннями
Готовий приклад з @ditsmod/cors
можна проглянути в репозиторії Ditsmod.
Модуль може працювати з дефолтними налаштуваннями зразу після імпорту:
import { featureModule } from '@ditsmod/core';
import { CorsModule } from '@ditsmod/cors';
@featureModule({
imports: [
CorsModule,
// ...
],
// ...
})
export class SomeModule {}
Тепер усі роути в SomeModule
будуть доповнені новими роутами з HTTP-методом OPTIONS
. Тобто, якщо SomeModule
має роути GET /users
та GET /posts
, то вони будуть автоматично доповнені роутами OPTIONS /users
та OPTIONS /posts
.
Можете перевірити роботу цього модуля приблизно такими запитами:
# Simply OPTIONS request
curl -i localhost:3000 -X OPTIONS
# OPTIONS CORS request
curl -i localhost:3000 -X OPTIONS -H 'Origin: https://example.com'
# GET CORS request
curl -i localhost:3000 -H 'Origin: https://example.com'
# CORS Preflight request
curl -i localhost:3000 \
-X OPTIONS \
-H 'Origin: https://example.com' \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: X-PINGOTHER, Content-Type'
# CORS request with credentials
curl -i localhost:3000/credentials
Робота з кастомними налаштува ннями
Якщо ви хочете змінити дефолтні налаштування, при імпорті можете передати деякі опції, які будуть братись до уваги на рівні модуля:
import { featureModule } from '@ditsmod/core';
import { CorsModule } from '@ditsmod/cors';
@featureModule({
imports: [
CorsModule.withParams({ origin: 'https://example.com' }),
// ...
],
// ...
})
export class SomeModule {}
Також є можливість передати CORS-опції на рівні роуту:
import { featureModule, Providers } from '@ditsmod/core';
import { CorsModule, CorsOpts } from '@ditsmod/cors';
@featureModule({
imports: [
CorsModule,
// ...
],
providersPerRou: new Providers()
.useValue<CorsOpts>(CorsOpts, { origin: 'https://example.com' }),
// ...
})
export class SomeModule {}
Робота з куками під час CORS-запитів
Коли вам потрібно щоб CORS HTTP-відповідь містила куки, і ці куки приймались веб-браузерами, можна скористатись CorsService
:
import { controller, Res, route } from '@ditsmod/core';
import { CorsService } from '@ditsmod/cors';
@controller()
export class SomeController {
constructor(private res: Res, private corsService: CorsService) {}
@route('GET')
getMethod() {
this.corsService.setCookie('one', 'value for one');
this.res.send('Some response');
}
}
Як бачите, кука встановлюється за допомогою методу setCookie()
. В такому разі відповідь міститиме заголовок Access-Control-Allow-Credentials: true
.