Nestjs - промежуточное программное обеспечение не запускается по запросу OPTIONS - PullRequest
0 голосов
/ 25 марта 2019

При отправке запроса OPTIONS промежуточное программное обеспечение не срабатывает.

export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(CorsMiddleware).forRoutes({
      path: "*",
      method: RequestMethod.OPTIONS
    });
  }
}

Если бы я изменил RequestMethod.OPTIONS на RequestMethod.ALL, он был бы запущен для всех запросов, кроме OPTIONS.

Это задумано?Если так, как мы можем обойти это, когда мы хотим специально запустить промежуточное ПО для запроса OPTIONS.

Пример промежуточного программного обеспечения:

@Injectable()
export class CorsMiddleware implements NestMiddleware {
  resolve(...args: any[]): MiddlewareFunction {
    return (req, res, next) => {
      console.log("testing ?", req.method);
      next && next();
    };
  }
}

1 Ответ

0 голосов
/ 01 апреля 2019

Вместо использования промежуточного программного обеспечения вы можете попробовать добавить перехватчик:

@Injectable()
export class CorsInterceptor implements NestInterceptor {
    intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        const request: IncomingMessage = context.switchToHttp().getRequest();
        const response: ServerResponse = context.switchToHttp().getResponse();

        if ('access-control-request-headers' in request.headers) {
            response.setHeader('access-control-request-headers', request.headers['access-control-request-headers']);
        }

        if ('access-control-request-method' in request.headers) {
            response.setHeader('access-control-request-method', request.headers['access-control-request-method']);
        }

        response.setHeader('access-control-allow-origin', '*');

        return next.handle();
    }
}

Чтобы использовать его, вам также необходимо добавить декоратор над классом контроллера:

@UseInterceptors(CorsInterceptor)
export class SimpleController {
}
...