Nestjs 項目中,這九個裝飾器是必不可少的!
作者:林三心不學挖掘機
Nestjs 項目中,這 9 個裝飾器分別為權限驗證裝飾器 - @Roles(),請求日志裝飾器 - @LogRequest(),緩存裝飾器 - @Cache()等。
前言
大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~
一、權限驗證裝飾器 - @Roles()
基于角色的訪問控制(RBAC),限制接口訪問權限
// src/decorators/roles.decorator.ts
import { SetMetadata } from'@nestjs/common';
// 定義角色枚舉
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)
);
}
// 在服務層配置:
@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 {}
責任編輯:武曉燕
來源:
前端之神