我想为全局创建一个响应格式序列化,所以我想在请求对象中添加函数返回类型。所以在拦截器中我可以获取返回类型并应用序列化。我想将拦截器全局应用于所有模块以常用的全局级别。这就是为什么我想在请求对象中添加函数返回类型
示例
@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 ...;
}
要以请求选择的格式发送响应,您可以创建一个拦截器。该拦截器从 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());