nestjs 一切都是以模块为基础的。用module一般用来组织架构。
module一半儿以**@Module**装饰器注,内容有四部分,imports ,controllers, providers, exports.
imports
导入其他模块的module。一般在app.module.ts中导入所有你开发的其他功能的module
controller
一般是写明自己模块的controller,让nest知道那些controller应该被安装
providers
provider - service, repository, factory, helper 等等都可认为是provider,写明便于nest自动注入
exports
一般导出自己模块的providers中内容,即service供其他模块使用
** 具体使用 **
@Module({
// imports:[CatsModule.forRoot()] 引入并使用
imports: [CatsModule],
controllers: [AppController],
providers: [{provide:APP_FILTER,useClass:HttpExceptionFilter},AppService,],
})
@Module({
controllers: [CatsController],
providers: [CatsService], // 组织程序架构
exports: [CatsService], // 导出其他模块可以使用
})
中间件是在路由处理程序 之前 调用的函数
** 实现**
@Injectable()
export class LoggerMiddleware implements NextMiddleware {
use(req: Request, res: Response, next: NextFunction) {
next();
}
}
export function logger(res, req, next) {
console.log(res);
next();
}
configure(consumer: MiddlewareConsumer) {
// consumer.apply(LoggerMiddleware).forRoutes('cats'); // 限定特定路由
// consumer.apply(LoggerMiddleware).forRoutes({path;'cats',method:RequestMethod.GET})
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST }, // 使用 path-to-regexp 支持通配符
'cats/(.*'),
)
.forRoutes(CatsController);
}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(logger); //全局使用
await app.listen(3000);
}
bootstrap();
内置的异常层负责处理整个应用程序中的所有抛出的异常。当捕获到未处理的异常时,最终用户将收到友好的响应。
@Get()
async findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
export class ForbiddenException extends HttpException {
constructor() {
super('Forbidden', HttpStatus.FORBIDDEN);
}
}
对异常层拥有完全控制权.
基于某些动态因素添加日志记录或使用不同的 JSON 模式,
** 开发 **
@Catch()
export class AllExceptionFilter
extends BaseExceptionFilter
implements ExceptionFilter
{
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const res = ctx.getResponse();
const req = ctx.getRequest();
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
res.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: req.url,
});
super.catch(exception, host);
}
}
** 使用 **
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
@Injectable()
export class ValidatePipe implements PipeTransform {
// 自定义🇬🇺
transform(value: any, { metatype }: ArgumentMetadata) {
if (!metatype || !this.toValidate(metatype)) {
return value;
}
const object = plainToInstance(metatype, value);
const errors = await validate(object);
if (errors.length > 0) {
throw new BadRequestException('error');
}
return value;
}
private toValidate(metatype: Function): boolean {
const types: Function[] = [String, Boolean, Number, Array, Object];
return !types.includes(metatype);
}
}
@Get('/name')
//new DefaultValuePipe(false) 提供默认值
async findOne (@Query('id',ParseIntPipe) id:number){//也可以是实例需要自定义报错信息的时候使用
return this.catsService.findOne(id)
}
它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。授权处理.
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.get('roles', context.getHandler());
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
return matchRoles(roles, user.roles);
}
}
@Injectable()
export class transformInterceptor
implements NestInterceptor>
{
intercept(
context: ExecutionContext,
next: CallHandler,
): Observable | Promise> {
return next.handle().pipe(
map((data) => {
{
data;
}
}),
);
}
}
nest内置了很多 @Req @ Res @Body等参数装饰器
export const User = createParamDecorator((data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
const user = request.user;
return data ? user && user[data] : user;
});
export function Auth(...roles: Role[]) {
return applyDecorators(
SetMetadata('roles', roles),
UseGuards(AuthGuard, RolesGuard),
ApiBearerAuth(),
ApiUnauthorizedResponse({ description: 'Unauthorized"' })
);
}
@Auth('admin')