NestJS通过TypeORM框架连接MongoDB根据主键查询返回空

前言

最近刚上手NestJS,想通过NestJS与mongoDB实现一个小功能,刚上手就碰到根据主键id查询返回为空的问题。

情景再现

1. 定义了一个entity

import { Column, Entity, ObjectId, ObjectIdColumn } from "typeorm";

@Entity('appinfo')
export class AppinfoEntity {

    /**
     * 主键
     */
    @ObjectIdColumn()
    id: ObjectId;

    /**
     * 应用名称
     */
    @Column({ length: 32 })
    name: string;

    /**
     * 应用备注
     */
    @Column({ length: 255 })
    remark: string

    /**
     * 创建时间
     */
    @Column({ type: 'timestamp', name: 'create_time', default: () => 'CURRENT_TIMESTAMP' })
    createTime: Date;

    /**
     * 更新时间
     */
    @Column({ type: 'timestamp', name: 'update_time', default: () => 'CURRENT_TIMESTAMP' })
    updateTime: Date;

    /**
     * 创建人员id
     */
    @Column()
    createUserId: string;
   /**
     * 创建人员名称
     */
    @Column({length:32})
    createUserName: string;

    /**
     * 更新人员id
     */
    @Column()
    updateUserId: string;

    /**
     * 更新人员名称
     */
    @Column({length:32})
    updateUserName: string;
}

其中主键就是字段id

2. 在service中进行查询


import { HttpException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { MongoRepository } from 'typeorm';
import { AppinfoEntity } from './appinfo.entity';
import { appinfoDto} from './dto/appInfo.dto';
import { ObjectId } from 'mongodb'

@Injectable()
export class AppinfoService {

    constructor(
        @InjectRepository(AppinfoEntity)
        private readonly appinfoRepository: MongoRepository<AppinfoEntity>,
    ) { }
    
    /**
     * 根据主键查询
     */
    async select(post: appinfoDto) {
        const { id } = post;
        console.log("id: " + id);
        const appinfoEntiy = await this.appinfoRepository.findOneBy({
                 _id: id
             })
        console.log("appinfoEntiy: ", JSON.stringify(appinfoEntiy));
        //注意,这里一直返回都是null
    }
}

逻辑比较简单,前端传过来一个参数为id,类型为string,然后根据id去进行查询。神奇的是,一个很简单的根据主键查询,结果一直是空。
浪费了两个小时时间,总算是找到了解决方案。

解决办法

由于前端传过来的字段id为string类型,所以如果拿这个id直接去mongoDB查询,是查不出结果的,这点可以在navicat里面复现。

所以就需要把id转变成objectId类型。代码如下:

import { HttpException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import {MongoRepository } from 'typeorm';
import { AppinfoEntity } from './appinfo.entity';
import { CreateAppinfoDto, UpdateAppinfoDto } from './dto/appInfo.dto';
import { ObjectId } from 'mongodb' //注意这个ObjectId一定要从 mongodb里面导入,而不是typeorm

@Injectable()
export class AppinfoService {

    constructor(
        @InjectRepository(AppinfoEntity)
        private readonly appinfoRepository: MongoRepository<AppinfoEntity>,
    ) { }


    /**
     * 根据主键查询
     */
    async select(post: UpdateAppinfoDto) {
        const { id } = post;
        console.log("id: " + id);
        const appinfoEntiy = await this.appinfoRepository.findOneBy({
                 _id: new ObjectId(id)
             })
        console.log("appinfoEntiy: ", JSON.stringify(appinfoEntiy));
    }
}

需要new ObjdectId(id) 方法将id转为ObjectId,就可以查询出结果。

另外注意这个ObjectId一定要从 mongodb里面导入,而不是typeorm

import { ObjectId } from 'mongodb' //注意这个ObjectId一定要从 mongodb里面导入,而不是typeorm

最后

作者刚接触typeScrpt以及nestjs,这个是暂时能找到的方法,如果你有更好的方案,欢迎评论区讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
连接 MongoDB,您可以使用 Nest.js 的官方 MongoDB 模块 `@nestjs/mongoose`。 1. 安装依赖 ``` npm install --save @nestjs/mongoose mongoose ``` 2. 配置模块 在应用程序的根模块中配置 `MongooseModule`,并传递 MongoDB 连接字符串。 ```typescript import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost/nestjs'), ], }) export class AppModule {} ``` 3. 创建模式 在 `app.module.ts` 同级目录下创建一个 `cats` 目录,并在其中创建一个 `cat.schema.ts` 文件。 ```typescript import * as mongoose from 'mongoose'; export const CatSchema = new mongoose.Schema({ name: String, age: Number, breed: String, }); ``` 4. 创建模型 在 `cats` 目录中创建一个 `cat.model.ts` 文件,使用 `@nestjs/mongoose` 中的 `@nestjs/mongoose` 装饰器,将模式注入到模型中。 ```typescript import { Document } from 'mongoose'; import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; export type CatDocument = Cat & Document; @Schema() export class Cat { @Prop() name: string; @Prop() age: number; @Prop() breed: string; } export const CatSchema = SchemaFactory.createForClass(Cat); ``` 5. 注册模型 在 `app.module.ts` 中导入 `mongoose` 模块,并使用 `MongooseModule.forFeature()` 方法,注册 `Cat` 模型。 ```typescript import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; import { Cat, CatSchema } from './cats/cat.model'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost/nestjs'), MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }]), ], controllers: [CatsController], providers: [CatsService], }) export class AppModule {} ``` 现在,您已经成功配置了 Nest.js 应用程序与 MongoDB连接。您可以在您的服务或控制器中使用 `Cat` 模型来执行数据库操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值