【发布时间】:2023-03-29 11:24:01
【问题描述】:
我正在尝试使用类继承和装饰器来实现可重用控制器,因为我找不到适合 nestjs mongodb 的 CRUD 包。
现在我的问题是我无法使用反射元数据覆盖控制器的某些属性。下面的示例代码:
可重复使用的控制器:
export class MongooseCrudController {
constructor(
public model: ModelType<{} | any>,
public crudOptions?: CrudOptionsWithModel,
) {
}
@Post()
@ApiOperation({ summary: 'Create a record' })
create(@Body() body: CrudPlaceholderDto, @Query() query: CreateUpdateQueryDto) {
const transform = get(this.crudOptions, 'routes.create.transform');
const { populate = undefined } = query;
if (transform) {
body = transform(body);
}
return this.performCreate(body, populate);
}
}
装饰器更新一些属性:
const CRUD_ROUTES = {
create: 'create',
};
const allMethods = Object.values(CRUD_ROUTES);
export const Crud = (options: CrudOptionsWithModel) => {
options = merge({}, CrudConfig.options, options);
return target => {
const controller = target.prototype;
// get define DTO at decorator
const methods = allMethods.filter(v => !!get(options, `routes.${v}`));
methods.forEach((method) => {
const types = Reflect.getMetadata(PARAMTYPES_METADATA, controller, method);
if (types) {
Reflect.decorate([
// Update Dto
Reflect.metadata(PARAMTYPES_METADATA, types.map((v: any) => {
if (get(v, 'name') === CrudPlaceholderDto.name) {
return get(options, `routes.${method}.dto`, options.model);
}
return v;
})),
...get(options, `routes.${method}.decorators`, []),
], controller, method, Object.getOwnPropertyDescriptor(controller, method));
}
});
};
};
控制器上的示例应用程序
@Crud({
model: Menu,
routes: {
create: { dto: MenuDto, summary: "API to create menu" },
},
})
@Controller('menus')
export class MenusController extends MongooseCrudController {
constructor(public model: MenusService,) {
super(model);
}
}
现在我已经实现了覆盖 CrudPlaceholderDto 上的参数装饰器,我还需要更新 @ApiOperation({ summary: 'Create a record' }) 的摘要值它在我使用的每个控制器上都有一个正确的名称。
【问题讨论】:
标签: typescript nestjs