typescript 我如何使用NestJS设置响应中的头字段?

oxalkeyp  于 2023-01-18  发布在  TypeScript
关注(0)|答案(3)|浏览(262)

我在努力:

@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
9gm1akwq

9gm1akwq1#

不是最优雅的方式:return res.set({ 'x-access-token': loginResponse.access_token }).json(loginResponse);
我将把这个逻辑分离到一个拦截器中,检查响应对于path /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: Res): Res {
    return res.set({ 'x-access-token': 1 }).json({ hello: 'world' });
  }
}

这是我的工作版本,请注意快速响应,而不是Nest.js。
编辑:从Nest.js/common导入的类型是一个装饰器函数,而不是不使用类型,* 或 * 从Express.js导入响应。

5vf7fwbs

5vf7fwbs2#

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

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

mbskvtky3#

我使用了一个拦截器,因为我想在响应的头中添加一个字段来指示我的服务,所以我也将其设置为全局拦截器,但是您也可以通过路由来使用它。
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();

相关问题