NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库

Posted

技术标签:

【中文标题】NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库【英文标题】:NestJS TypeORM MongoDB can not use find or FindOne to search repository 【发布时间】:2021-10-12 11:02:15 【问题描述】:

我正在使用 NestJs 和 TypeORM 和 MongoDB 开展一个项目。早些时候我们使用 express 和 mongoose 并在数组列中查找结果,我们使用了这样的东西:

我正在使用nestJS + TypeORM 和MongoDB 创建一个REST API。我遇到的问题是,每当我对 findOne 进行 GET 调用或在实体/表中查找所有项目时,都会导致错误提示无法读取未定义的属性“原型”或 TypeError:“instanceof”的右侧是不是一个对象。

我的实体

@Entity( name: 'discordconfigs' )
export class DiscordConfig extends BaseEntity 
  @ObjectIdColumn()
  _id: ObjectID;

  @Column()
  clientId: string;

REPO 的 DI(服务文件中的内部构造函数)

@InjectRepository(DiscordConfig)
    private guildConfigRepository: MongoRepository<DiscordConfig>,

通常,当使用带有 SQL 数据库的 NestJS + TypeORM 时,我可以使用下面的代码 sn-p 来返回数组中的所有项目。对 MongoDB 执行此操作会导致错误无法读取未定义的属性“原型”并且不返回任何内容。 return this.guildConfigRepository.find();

我可以将上面的内容更改为这个,它会将所需的数据返回给我,但会导致抛出相同的错误,而不是我认为这只是一个警告而不是错误。

return await this.guildConfigRepository
      .createCursor(this.guildConfigRepository.find())
      .toArray(); 

如果我想返回一个特定的项目,那么我尝试使用它,但我得到一个错误 TypeError: 'instanceof' 的右侧不是对象。我在控制台记录了 + 检查了传入参数的类型,这是我作为参数和字符串输入的正确数据。

return await this.guildConfigRepository.findOne( clientId );

我能够发布数据并将其保存到数据库中而不会导致任何错误。如果我将我的数据库类型更改为 mysql 数据库并使用正常的 TypeORM 方式调用存储库,那么我不会收到任何错误。

我将如何使用 typeORM 来解决这个问题,或者使用 mongoose 会更容易。我正在考虑改用 mongoose,但我想让 typeORM 工作,因为它可以与 nestJS 一起使用。

这是我连接到数据库的方式(App.Module 中的内部导入)

    TypeOrmModule.forRoot(
      type: 'mongodb',
      url: 'mongoURI',
      database: 'database',
      entities: entities,
      synchronize: true,
    ),

如果我将它切换到具有这样的连接设置的 MYSQL 数据库,我的 API 可以正常工作。

    TypeOrmModule.forRoot(
      type: 'mysql',
      host: 'ipaddress',
      port: 3306,
      username: 'userLogin',
      password: 'userPassword',
      database: 'databaseName',
      entities: entities,
      synchronize: true,
    ),

【问题讨论】:

【参考方案1】:

试试本帖末尾的方法:

https://github.com/nestjs/typeorm/issues/405

【讨论】:

以上是关于NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库的主要内容,如果未能解决你的问题,请参考以下文章

nestjs使用Typeorm实现数据库CRUD操作

NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”

NestJS typeorm - 无法创建实体

无法使用 typeorm (NestJS) 在 SQL Server 中插入 bigint

错误:使用 Nestjs + Graphql + Typeorm 时无法确定 GraphQL 输入类型

使用 Typeorm 连接到 Nestjs 中的 mssql,但 Nest 无法解析 EmployeeRepository 的依赖关系