【问题标题】:Nestjs - middleware not triggered on OPTIONS requestNestjs - 选项请求未触发中间件
【发布时间】:2019-08-15 20:16:18
【问题描述】:

发送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();
    };
  }
}

【问题讨论】:

  • 如果你有一个最小的 repo 来重现它,我认为这可能更适合作为一个问题。 github.com/nestjs/nest/issues
  • 是否有其他中间件已经处于活动状态,可以拦截 OPTIONS ?
  • 事实上,似乎根本无法在 Nestjs 中处理预检请求
  • 我们使用拦截器处理 CORS 没有问题。
  • @KarolSamborski 你能提供你的拦截器的例子吗?你使用的是哪个 Nestjs 版本?

标签: typescript nestjs


【解决方案1】:

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

@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 {
}

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2015-02-25
    • 2017-09-18
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多