【问题标题】:Override Swagger Attribute in A Reusable Controller在可重用控制器中覆盖 Swagger 属性
【发布时间】: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


    【解决方案1】:

    你不能简单地将具体描述传递给构造函数,而不是在 MongooseCrudController 类中硬编码吗?

    【讨论】:

    • 不能在装饰器参数中调用。试图为我实现可重复使用的控制器而不是重复输入描述。我想要做的是将默认描述设置为类名并仍然允许覆盖它。
    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 2021-09-21
    • 2015-10-08
    • 1970-01-01
    • 2015-02-27
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多