如何在 NestJS 的响应中设置 header 字段?
How can I set a header field in a response with NestJS?
我正在尝试:
@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
不是最优雅的方式:return res.set({ 'x-access-token': loginResponse.access_token }).json(loginResponse);
我会将此逻辑分离到一个拦截器中,检查响应是否对路径 /login 有效,如果是 return 正确的 header(使用来自 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' });
}
}
这是我的工作版本,请注意快速响应而不是 Nest.js。
编辑:从 Nest 导入的类型。js/common 是装饰器函数,而不是不使用类型, 或 从 Express.js 导入响应。
To specify a custom response header, you can either use a @Header() decorator or a library-specific response object (and call res.header() directly).
从 @nestjs/common package
.
导入 Header
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
我使用拦截器。因为我想在响应的 headers 中添加一个字段来指示我的服务,所以我也将其设置为全局拦截器,但您也可以通过路由使用它。
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();
我正在尝试:
@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
不是最优雅的方式:return res.set({ 'x-access-token': loginResponse.access_token }).json(loginResponse);
我会将此逻辑分离到一个拦截器中,检查响应是否对路径 /login 有效,如果是 return 正确的 header(使用来自 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' });
}
}
这是我的工作版本,请注意快速响应而不是 Nest.js。
编辑:从 Nest 导入的类型。js/common 是装饰器函数,而不是不使用类型, 或 从 Express.js 导入响应。
To specify a custom response header, you can either use a @Header() decorator or a library-specific response object (and call res.header() directly).
从 @nestjs/common package
.
@Post()
@Header('Cache-Control', 'none')
create() {
return 'This action adds a new cat';
}
我使用拦截器。因为我想在响应的 headers 中添加一个字段来指示我的服务,所以我也将其设置为全局拦截器,但您也可以通过路由使用它。
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();