【问题标题】:TypeOrm findOne throws 'Argument passed in must be a single String of 12 bytes or a string of 24 hex characters'TypeOrm findOne throws '传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串'
【发布时间】:2020-05-27 20:47:12
【问题描述】:

您好,我正在使用带有 TypeOrm 的 NestJs,目前连接到 MongoDB(但我想独立,因为大多数客户使用 MSSQL 和 Postgres 数据库)。

基本上我想将键/值对存储到数据库中。两者都是String 类型。这是持有该对的映射实体

@Entity()
export class Mapping extends BaseEntity {
  @PrimaryColumn()
  key: string;

  @Column()
  value: string;
}

存储库当前为空

@EntityRepository(Mapping)
export class MappingsRepository extends Repository<Mapping> {}

在我的服务文件中,我尝试通过键查找值

  public async getValueByKey(key: string): Promise<string> {
    const mapping: Mapping = await this.mappingsRepository.findOne(key);

    if (!mapping) {
      throw new NotFoundException(`Key ${key} does not exist`);
    }

    return mapping.value;
  }

不幸的是,findOne 函数在传入密钥时总是抛出这个错误

传入的参数必须是单个 12 字节的字符串或 24 个十六进制字符

我该如何解决这个问题,以便我可以传入String 类型的任何键?参数key 已定义,我尝试使用fffsdagsdgfdg 等虚拟值

【问题讨论】:

  • key 的值是多少?确保已定义。
  • 已定义。我用随机字符串对其进行了测试。所以参数本身带有一个不为空的随机字符串

标签: mongodb nestjs typeorm


【解决方案1】:

你可以试试

await this.mappingsRepository.findOne({key});

我猜typeorm 不理解除id 之外的主键

【讨论】:

    【解决方案2】:

    findOne 对于 mongo 意味着它将按属性 _id 而不是您的 key 搜索文档 因为,默认情况下,mongo 始终将此 _id 添加为每个文档的唯一验证器 因此,您应该像itssajan answer中定义的那样对该方法提供查询

    但我认为你的 TypeORM 用例不是最好的,因为它是用于 SQL dbs,而不是 NoSQL dbs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      相关资源
      最近更新 更多