如何在nest js中的request对象中添加函数返回类型

问题描述 投票:0回答:1

我想为全局创建一个响应格式序列化,所以我想在请求对象中添加函数返回类型。所以在拦截器中我可以获取返回类型并应用序列化。我想将拦截器全局应用于所有模块以常用的全局级别。这就是为什么我想在请求对象中添加函数返回类型

示例

@Controller(':breedId/cats')
export class CatsController {
  constructor(
    private readonly CatsService: CatsService,
  ) {}

  @Post()
  @ReturnType(Dto)
   create(
    @Param('breedId', ParseIntPipe) breedId: number,
    @Body() dto: CreateDto,
  ): Promise<CreateDto> {
   return ...   
  }

  @Post('list')
  async findAll(
    @Param('breedId', ParseIntPipe) breedId: number,
    @Body() CreateDto: CreateDto,
  ): Promise<CreateDto[]>  {

   
    return ...;
  }

javascript node.js mongodb nestjs typeorm
1个回答
0
投票

要以请求选择的格式发送响应,您可以创建一个拦截器。该拦截器从 request.query 参数中读取格式(我们从上下文中获取请求对象),然后将适当的序列化函数应用于响应以返回所需的类型。这是拦截器的示例:

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

// Define a type to represent serialization formats
type SerializationFormat = 'json' | 'xml' | 'simple';

@Injectable()
export class ResponseSerializationInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest();
    const format = this.getFormat(request); // Get format from request

    return next.handle().pipe(
      map((data) => {
        if (format) {
          switch (format) {
            case 'json':
              return this.toJson(data);
            case 'xml':
              return this.toXml(data);
            case 'simple':
              return 'Simple data';
            default:
              return data;
          }
        } else {
          return data;
        }
      }),
    );
  }

  private getFormat(request: any): SerializationFormat | undefined {
    console.log(request.query.format);
    const format = request.query.format;

    return format;
  }

  private toJson(data) {
    return { data, type: 'json' };
  }
  
  private toXml(data) {
    return { data, type: 'xml' };
  }
}

要在所有模块上应用拦截器,我们只需在 main.ts 文件中声明它:

app.useGlobalInterceptors(new ResponseSerializationInterceptor());
© www.soinside.com 2019 - 2024. All rights reserved.