当前位置: 首页 > 知识库问答 >
问题:

内斯特

莘聪
2023-03-14

我目前正在实现一个演示应用程序,以了解与mongoDB的NestJS框架。

我当前面临以下错误消息,无法修复:

对于型号“玩家”40997ms CastError,路径“\u id”处的值“1”失败:对于型号“玩家”的路径“\u id”处的值“1”,转换为ObjectId失败

我的控制器看起来像这样:

@Controller('/players')
export class PlayersController {
    constructor(private playersService: PlayersService) { }

    @Get('/:id')
    async getPlayer(@Res() res, @Param('id') id: number) {
        const player = await this.playersService.getPlayer(id);
        if (!player) throw new NotFoundException('Player does not exist!');
        return res.status(HttpStatus.OK).json(player);
    }
}

我的服务如下所示:

@Injectable()
export class PlayersService {
    constructor(@InjectModel('Player') private readonly playerModel: Model<Player>) { }

    async getPlayer(playerId: number): Promise<Player | undefined> {
        const player = await this.playerModel.findById(playerId);
        return player;
    }
}

我的DTO如下所示:

export class CreatePlayerDto {
    readonly id: number;
    readonly name: string;
    readonly score: number;
    readonly created_at: Date;
    readonly is_deleted: boolean;
}

我的模型如下所示:

export class Player extends Document {
    readonly id: number;
    readonly name: string;
    readonly score: number;
    @Exclude() readonly createdAt: Date;
    @Exclude() readonly isDeleted: boolean;
}

我的猫鼬模式如下所示:

export const PlayerSchema = new mongoose.Schema({
    id: Number,
    name: String,
    score: Number,
    createdAt: { type: Date, default: Date.now },
    isDeleted: Boolean
});

键入db后的示例mongoDB条目。球员。查找()

{ "_id" : ObjectId("5e5fccac9d16bf2d325cd57a"), "id" : 1, "name" : "Player One", "score" : 0, "createdAt" : "2020-04-03", "isDeleted" : false }

我在这里做错了什么,或者如何修复此错误?

共有1个答案

濮升
2023-03-14

出现错误的原因:
在服务中,您有一段代码试图从DB中查找播放器文档:this。playerModel。findById(playerId)

该查询中playerId的值是一个字符串(或铸造后的数字),但是,mongoose方法模型。findById在内部执行类似的操作:this。playerModel。查找({u id:playerId}) 从您添加到问题中的示例数据库输出中,您可以看到_id是一个ObjectId,而不是字符串或数字,因此您得到错误CastError:model“Player”的路径“_id”处的值“1”的转换为ObjectId失败

解决方法:
您可以做两件事:
1。更新查询以使用id而不是_id。然后您的查询将类似于:this。playerModel。查找({id:playerId})
2。更新架构,使_id属性是一个数字而不是ObjectID(默认值)。如果这样做,则必须确保_id值的唯一性。如果这样做,您的查询就不需要更改。然后,您的模式将如下所示:

export const PlayerSchema = new mongoose.Schema({
    _id: Number,
    name: String,
    score: Number,
    createdAt: { type: Date, default: Date.now },
    isDeleted: Boolean
});

如果没有硬性要求_id字段为数字,您可以使用ObjectId值而不是数字,这将节省确保_id字段唯一性的压力。为此,将_id属性设置为_id: mongoose。模式中的ObjectId

您还需要更新dto、模型以及键入播放器对象的每个其他位置,以反映模式更新,即添加具有不同类型的“_id”属性,以及删除以前的“id”属性。

如果您想知道_id字段是如何到达那里的;它是每个MongoDB文档的属性,充当主键。即使您没有将其添加到模式中,MongoDB驱动程序(本例中为mongoose)或mongod服务器也会为您添加它。这里有更多细节

 类似资料:
  • 我在Kubernetes是个新手。我想知道在kubernetes环境中最好的生产部署场景是什么。 在过去的学派中,我习惯于将Web服务器(例如Nginx或Apache)放在DMZ层,而将其放在其他层(我们称之为层)。这样,只有web服务器在DMZ上,恶意攻击只能在web服务器VM上进行。 据我所知,K8S部署不再需要这种方法;这是因为K8S自己处理网络、吊舱和流量。所以我在考虑最确定的部署方案。

  • 我打算有一个带有Jenkins的光盘管道,它接受我的应用程序,将码头工人映像发布到我的私人码头工人存储库。我想我知道怎么做。 我不确定的是库伯内特斯部分。我想把那个图像部署到我的私人库伯内特斯集群(目前是1个主集群) 问:安装了 kubectl 和 docker 的詹金斯从站是否需要成为 Kubernetes 集群的一部分才能触发部署?如何触发该部署?

  • 我正在尝试运行集成minikube与Jenkins。我得到以下异常: 配置如下Kubernetes url所示:192.168.99.101:8443 Kubernetes 1 希望你的协助。

  • 我试图有1个redis大师与2个redis复制品绑在一个3法定人数哨兵在Kubernetes。我对Kubernetes很陌生。 我最初的计划是让主控器在一个吊舱上运行,并绑定到一个Kubernetes SVC,而两个副本在自己的吊舱上运行,并绑定到另一个Kubernetes SVC。最后,3个哨兵吊舱将被绑在他们自己的SVC上。副本将被绑定到主SVC(因为没有SVC,ip将会改变)。sentine

  • 我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。 现在的情况 我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他