【问题标题】:How can I set a header field in a response with NestJS?如何使用 NestJS 在响应中设置标头字段?
【发布时间】:2020-08-25 02:37:20
【问题描述】:

我正在尝试:

    @Post('login')
    async login(@Body() body: AuthDto, @Res() res: Response) {
        const loginResponse = await this.authService.login(body);
        console.log('loginResponse', loginResponse)
        res.headers.set('x-access-token', loginResponse.access_token)
        return loginResponse
    }

但没有骰子。我收到一个错误:

TypeError: Cannot read property 'set' of undefined

【问题讨论】:

    标签: typescript nestjs fastify


    【解决方案1】:

    不是最优雅的方式:return res.set({ 'x-access-token': loginResponse.access_token }).json(loginResponse);

    我会将此逻辑分离到一个拦截器中,检查响应是否对路径 /login 有效,如果是则返回正确的标头(使用 loginResponse 中的一些值)

    import { Controller, Get, Response } from '@nestjs/common';
    import { Response as Res } from 'express';
    import { AppService } from './app.service';
    
    @Controller()
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get()
      getHello(@Response() res: Res): Res {
        return res.set({ 'x-access-token': 1 }).json({ hello: 'world' });
      }
    
      @Get()
      getHelloAlt(@Response() res) {
        return res.set({ 'x-access-token': 1 }).json({ hello: 'world' });
      }
    }
    

    这是我的工作版本,请注意 Express Response 而不是 Nest.js。

    编辑:从 Nest.js/common 导入的类型是装饰器函数,而不是不使用类型,从 Express.js 导入响应。

    【讨论】:

    • 相同:Property 'set' does not exist on type 'Response'
    • 这个错误是在编译时还是运行时?如果是编译时,您从哪里导入响应?原生还是快递?请注意,还有一个全局响应类型。我已经为你更新了我原来的答案,让我知道它是如何工作的。
    • 在编译时。我从nest.js导入
    • async login(@Req() req: Request, @Response() res) { - 做到了
    • 如果你想保持类型安全,请使用 Express.js 响应接口,它不会影响运行时,因为内部使用快速响应。
    【解决方案2】:

    要指定自定义响应标头,您可以使用 @Header() 装饰器或特定于库的响应对象(并直接调用 res.header())。

    @nestjs/common package 导入标头。

    @Post()
    @Header('Cache-Control', 'none')
    create() {
      return 'This action adds a new cat';
    }
    

    【讨论】:

      【解决方案3】:

      我使用拦截器。由于我想在响应的标头中添加一个字段来指示我的服务,因此我还将其设置为全局拦截器,但您也可以通过路由使用它。

      response-add-access-token-to-header.interceptor.ts

      import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
      import { Observable } from 'rxjs';
      
      import { Response as ExpressResponse } from 'express';
      
      @Injectable()
      export class ResponseAddAccessTokenToHeaderInterceptor implements NestInterceptor {
          intercept(context:ExecutionContext, next:CallHandler): Observable<any> {
      
              const ResponseObj:ExpressResponse = context.switchToHttp().getResponse();
              ResponseObj.setHeader('x-access-token', 'Your Data' );
              return next.handle();
          }
      }
      

      要全局添加,调整 main.ts:

      async function bootstrap() {
          const app = await NestFactory.create(AppModule);
          app.useGlobalInterceptors(new ResponseAddAccessTokenToHeaderInterceptor());
          await app.listen(8080);
      }
      bootstrap();
      

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 2021-09-02
        • 2020-08-30
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多