/** * Response interceptor. * @file 统一响应结构拦截器 * @module interceptor/response.interceptor * @author zhxiao1124 */ import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common"; import { Reflector } from "@nestjs/core"; import { Request } from "express"; import { map, Observable } from "rxjs"; import { SUCCESS_MESSAGE } from "@constants/text.constant"; import { API_MESSAGE_METADATA } from "@app/decorators/api-message.decorator"; import { getRequestCost } from "@app/utils/request-context.util"; @Injectable() export class ResponseInterceptor implements NestInterceptor { constructor(private readonly reflector = new Reflector()) {} intercept(context: ExecutionContext, next: CallHandler): Observable { const request = context.switchToHttp().getRequest(); const message = this.reflector.get(API_MESSAGE_METADATA, context.getHandler()) ?? SUCCESS_MESSAGE; return next.handle().pipe( map((data) => ({ code: 0, data: data ?? {}, message, timestamp: Date.now(), requestId: request.requestId, cost: `${getRequestCost(request)}ms`, })), ); } }