我有一个结构如下的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异常,那么我怎样才能实现动态字段类型呢?有什么想法都欢迎,谢谢!
1条答案
按热度按时间pcww981p1#
Menu
类具有Menu[]
类型的属性childrens
,而“UpdateMenuDto”类具有number[]
类型的属性childrens
,因此如下所示:您得到了这个错误,因为Nestjs无法用接收到的
updateMenuDto
更新找到的菜单文档,我没有看到Menu数组和number数组之间的任何关系,所以我认为childrens
字段不应该存在于UpdateMenuDto
类中,也不应该存在于PUT请求主体中,但也许您需要这些数字来创建Menu数组,在这种情况下,您可以从updateMenuDto
创建一个新对象: