mongodb 如何在nestjs中使用动态字段类型

kqqjbcuj  于 2023-02-11  发布在  Go
关注(0)|答案(1)|浏览(137)

我有一个结构如下的DTO,当客户端保存数据时,我希望它的子字段是number[]。我的数据库是MongoDB,我使用Mongoose来管理我的模型。

//create-menu.dto.ts
export class CreateMenuDto {
  ...
  @IsArray()
  childrens: number[];
}

现在我希望服务器响应客户端查询时的类型为menu[],所以我定义了如下的Menu模式:

//menu.schema.ts
@Schema({ versionKey: false })
export class Menu {
  ...
  @Prop({ type: Number, ref: 'Menu' })
  childrens: Menu[];
}

menu.controller.ts:

@Put(':id')
  update(@Param('id') id: string, @Body() updateMenuDto: UpdateMenuDto) {
    return this.menuService.update(+id, updateMenuDto);
  }

menu.service.ts:

update(id: number, updateMenuDto: UpdateMenuDto) {
    const menu = this.menuModel.findOneAndUpdate({ _id: id }, updateMenuDto);
    return menu;
  }

当我使用REST客户端测试:

Put http://127.0.0.1:3000/api/menu/1
Content-Type: application/json

{
"childrens":[2]
}

服务器抛出500异常,那么我怎样才能实现动态字段类型呢?有什么想法都欢迎,谢谢!

pcww981p

pcww981p1#

Menu类具有Menu[]类型的属性childrens,而“UpdateMenuDto”类具有number[]类型的属性childrens,因此如下所示:

const menu = this.menuModel.findOneAndUpdate({ _id: id }, updateMenuDto);

您得到了这个错误,因为Nestjs无法用接收到的updateMenuDto更新找到的菜单文档,我没有看到Menu数组和number数组之间的任何关系,所以我认为childrens字段不应该存在于UpdateMenuDto类中,也不应该存在于PUT请求主体中,但也许您需要这些数字来创建Menu数组,在这种情况下,您可以从updateMenuDto创建一个新对象:

update(id: number, updateMenuDto: UpdateMenuDto) {
var newMenuDto: any = {...updateMenuDto};
newMenuDto.childrens = // use updateMenuDto.childrens to create newMenuDto.childrens of type Menu[]
const menu = this.menuModel.findOneAndUpdate({ _id: id }, newMenuDto);
return menu;
}

相关问题