【问题标题】:How to add header to all responses in NestJS v8 + GraphQL?如何在 NestJS v8 + GraphQL 中为所有响应添加标头?
【发布时间】:2022-02-03 19:37:36
【问题描述】:

我想为 NestJS 框架 (v8) 中的所有响应添加带有值的自定义标头。我认为正确的方法是使用全局拦截器,但我不知道该怎么做。

我正在添加我的拦截器:

app.useGlobalInterceptors(new HeadersInterceptor());

我找到了多种方法,但没有一种方法有效。最常见的样子:

import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, tap } from 'rxjs';

@Injectable()
export class HeadersInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      tap(() => {
        const res = context.switchToHttp().getResponse();

        res.setHeader('my-global-header', 'important-value');
      }),
    );
  }
}

但我收到一个错误:

res.setHeader is not a function

编辑:从正确答案来看,我应该提到我也在使用 GraphQL。

【问题讨论】:

    标签: javascript typescript graphql nestjs response-headers


    【解决方案1】:

    这取决于 NestJS 正在执行的上下文。这里我有 GraphQL 和 HTTP 上下文的示例。

    import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
    import { GqlExecutionContext } from '@nestjs/graphql';
    import { Response } from 'express';
    import { Observable } from 'rxjs';
    
    @Injectable()
    export class VersionHeaderInterceptor implements NestInterceptor {
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        // When the request is GraphQL
        if ((context.getType() as string) === 'graphql') {
          const gqlExecutionContext = GqlExecutionContext.create(context);
          const response: Response = gqlExecutionContext.getContext().res;
          response.setHeader('x-version', process.env.npm_package_version);
        }
    
        // When the request is HTTP
        if (context.getType() === 'http') {
          const http = context.switchToHttp();
          const response: Response = http.getResponse();
          response.setHeader('x-version', process.env.npm_package_version);
        }
    
        return next.handle();
      }
    }
    

    【讨论】:

      【解决方案2】:

      您的代码看起来不错。如果你尝试使用 express 的 Response 接口会发生什么?

      import { Response } from 'express';
      
      @Injectable()
      export class HeadersInterceptor implements NestInterceptor {
        intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
          const res: Response = context.switchToHttp().getResponse();
      
          res.setHeader('my-global-header', 'important-value');
      
          return next.handle();
        }
      }
      

      【讨论】:

      • 我也看过这个。 res.setHeader is not a function
      • 如果你安装'npm install -D @types/express'?
      • 我没有类型错误,是JS错误。
      【解决方案3】:

      您可以简单地在响应对象上使用set 方法

      res.set('my-global-header', 'important-value')
      

      我相信setHeaderexpress.static() 中提供的选项之一。您可以在此查找文档

      【讨论】:

      • res.set is not a function - 不走运
      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2021-04-10
      • 2015-08-23
      • 2020-08-06
      • 2021-09-02
      相关资源
      最近更新 更多