Nestjs - OPTIONS请求未触发中间件

问题描述 投票:0回答:1

发送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();
    };
  }
}
typescript nestjs
1个回答
0
投票

您可以尝试添加拦截器,而不是使用中间件:

@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 {
}
© www.soinside.com 2019 - 2024. All rights reserved.