typescript - Como posso definir um campo de cabeçalho em uma resposta com NestJS?
Estou tentando:
@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
}
mas nada feito. Eu recebo um erro:
TypeError: Cannot read property 'set' of undefined
Resposta #1
Não é a maneira mais elegante: return res.set({ 'x-access-token': loginResponse.access_token }).json(loginResponse);
Eu separaria essa lógica em um interceptor, verificando se a resposta é válida para o caminho /login, e, se for, retorna o cabeçalho correto (usando algum valor de 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' });
}
}
Esta é a minha versão funcional, note o Express Response e não o Nest.js.
EDITAR: O tipo importado de Nest.js/common é uma função decoradora, em vez disso use nenhum tipo, ou importe Response do Express.js.
Resposta #2
Para especificar um cabeçalho de resposta personalizado, você pode usar um decorador @Header() ou um objeto de resposta específico da biblioteca (e chamar res.header() diretamente).
Importe Header do pacote @nestjs/common.
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
Resposta #3
Eu uso um interceptor. Como quero adicionar um campo aos cabeçalhos na resposta indicando meu serviço, também configuro isso como um interceptor global, mas você pode usá-lo por rota também.
response-adicionar-token-de-acesso-ao-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();
}
}
Para adicioná-lo globalmente, ajuste o main.ts:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new ResponseAddAccessTokenToHeaderInterceptor());
await app.listen(8080);
}
bootstrap();
