• Nestjs项目中必不可少的9个装饰器
  • 发布于 1周前
  • 58 热度
    0 评论
一、权限验证装饰器 - @Roles()
基于角色的访问控制(RBAC),限制接口访问权限
// src/decorators/roles.decorator.ts
import { SetMetadata } from'@nestjs/common';
// 堆代码 duidaima.com
// 定义角色枚举
exportenum UserRole {
  ADMIN = 'admin',
  EDITOR = 'editor',
  USER = 'user'
}

/**
 * 角色权限装饰器
 * @param roles 允许访问的角色数组
 * 使用示例:@Roles([UserRole.ADMIN])
 */
exportconst Roles = (...roles: UserRole[]) => SetMetadata('roles', roles);
// 在守卫中使用:
@Injectable()
exportclass RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.get<UserRole[]>(
      'roles',
      context.getHandler()
    );
    // ...验证逻辑
  }
}
二、请求日志装饰器 - @LogRequest()
自动记录完整的HTTP请求信息
// src/decorators/log-request.decorator.ts
import { createParamDecorator, ExecutionContext } from'@nestjs/common';

/**
 * 记录请求完整信息
 * 使用示例:@LogRequest()
 */
exportconst LogRequest = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return {
      url: request.url,
      method: request.method,
      headers: request.headers,
      body: request.body,
      timestamp: newDate().toISOString()
    };
  }
);

// 在控制器中使用:
@Get()
async findOne(@LogRequest() logData: any) {
// logData会包含完整的请求信息
}
三、缓存装饰器 - @Cache()
声明式接口响应缓存,提升性能
// src/decorators/cache.decorator.ts
import { applyDecorators, UseInterceptors } from'@nestjs/common';
import { CacheInterceptor } from'@nestjs/cache-manager';

/**
 * 自定义缓存装饰器
 * @param ttl 缓存时间(秒)
 * 使用示例:@Cache(60)
 */
exportfunction Cache(ttl: number) {
return applyDecorators(
    UseInterceptors(CacheInterceptor),
    SetMetadata('cacheTTL', ttl)
  );
}
// 堆代码 duidaima.com
// 在服务层配置:
@Injectable()
exportclass CustomCacheInterceptor extends CacheInterceptor {
protected trackBy(context: ExecutionContext): string | undefined {
    const ttl = this.reflector.get<number>('cacheTTL', context.getHandler());
    // ...自定义缓存逻辑
  }
}
四、事务管理装饰器 - @Transactional()
自动管理数据库事务,保证数据一致性
// src/decorators/transaction.decorator.ts
import { Transaction } from'typeorm-transactional';

/**
 * 数据库事务装饰器
 * 使用示例:@Transactional()
 */
exportconst Transactional = () => (
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) => {
const originalMethod = descriptor.value;

  descriptor.value = asyncfunction (...args: any[]) {
    return Transaction({ isolationLevel: 'READ COMMITTED' })( 
      originalMethod.bind(this)
      .apply(this, args)
    );
  };
return descriptor;
};
五、参数验证装饰器 - @ValidateId()
参数格式预校验,防止非法输入
// src/decorators/validate-param.decorator.ts
import { 
  createParamDecorator,
  BadRequestException 
} from'@nestjs/common';

/**
 * ID参数格式验证
 * 使用示例:@ValidateId() id: string
 */
exportconst ValidateId = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const id = request.params.id;
    
    if (!/^[a-f\d]{24}$/i.test(id)) {
      thrownew BadRequestException('Invalid ID format');
    }
    return id;
  }
);
六、响应格式装饰器 - @StandardResponse()
统一API响应格式规范
// src/decorators/response-format.decorator.ts
import { 
  applyDecorators,
  Type,
  HttpCode,
  Header 
} from'@nestjs/common';
import { ApiResponse } from'@nestjs/swagger';

/**
 * 统一响应格式
 * @param status HTTP状态码
 * @param type 响应数据类型
 * 使用示例:@StandardResponse(200, UserDto)
 */
exportfunction StandardResponse<T>(status: number, type?: Type<T>) {
return applyDecorators(
    HttpCode(status),
    Header('Content-Type', 'application/json'),
    ApiResponse({ 
      status,
      type,
      description: 'Standard API response'
    })
  );
}
七、性能监控装饰器 - @Benchmark()
方法执行耗时监控与日志记录
// src/decorators/benchmark.decorator.ts
import { Logger } from'@nestjs/common';

const logger = new Logger('Benchmark');

/**
 * 方法执行时间监控
 * 使用示例:@Benchmark()
 */
exportfunction Benchmark() {
returnfunction (
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    const originalMethod = descriptor.value;
    
    descriptor.value = asyncfunction (...args: any[]) {
      const start = Date.now();
      try {
        returnawait originalMethod.apply(this, args);
      } finally {
        const duration = Date.now() - start;
        logger.log(`${propertyKey} executed in ${duration}ms`);
      }
    };
    return descriptor;
  };
}
八、多语言支持装饰器 - @Translate()
便捷获取国际化翻译内容
// src/decorators/i18n.decorator.ts
import { createParamDecorator } from'@nestjs/common';
import { I18nService } from'nestjs-i18n';

/**
 * 获取当前语言文本
 * 使用示例:@Translate() t: I18nService['translate']
 */
exportconst Translate = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
    const i18n = ctx.switchToHttp().getRequest().i18nService as I18nService;
    return(key: string, options?: any) => i18n.translate(key, options);
  }
);
九、版本控制装饰器 - @ApiVersion()
API多版本共存管理
// src/decorators/version.decorator.ts
import { Controller, SetMetadata, applyDecorators } from'@nestjs/common';
import { Version } from'@nestjs/common';

/**
 * API版本控制装饰器
 * @param versions 支持的版本数组
 * 使用示例:@ApiVersion(['1', '2'])
 */
exportfunction ApiVersion(versions: string[]) {
return applyDecorators(
    SetMetadata('apiVersions', versions),
    Version(versions)
  );
}

// 在控制器中使用:
@ApiVersion(['1', '2'])
@Controller('users')
exportclass UsersController {}
用户评论