You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TypeORM Query Builder查询PostgreSQL UUID主键报错:如何将字符串UUID转换为PostgreSQL UUID类型?

解决TypeORM Query Builder查询UUID时的PostgreSQL语法错误

这个问题我之前排查过,核心原因很明确:你传入的:id参数不是纯字符串UUID,而是一个包含id字段的对象——从错误信息里的"{"id":"8f294654-8385-4579-a714-0fae73839430"}"就能直接看出来,PostgreSQL自然没法把这个JSON格式的对象解析成UUID类型。

快速修复方法

你只需要确保传入的id是纯字符串格式的UUID即可,具体分两种情况处理:

  1. 如果id变量是嵌套对象
    提取对象里的id字段值,把参数改成纯字符串:

    // 先从对象中提取纯字符串UUID
    const actualUUID = id.id;
    
    this.repository.createQueryBuilder('products')
      .leftJoinAndSelect('products.brand', 'brands')
      .leftJoinAndSelect('products.category', 'categories')
      .leftJoinAndSelect('products.productOptions', 'productOptions')
      .where('products.id = :id', { id: actualUUID }) // 传入纯字符串
      .getOne()
    
  2. 如果是参数传递错误
    检查你获取id的来源,比如从HTTP请求参数、DTO对象中取值时,是不是不小心把整个对象传进去了。比如:

    // 错误示例:拿到了整个params对象
    // const id = req.params;
    
    // 正确示例:只拿id字段的字符串值
    const id = req.params.id;
    
    this.repository.createQueryBuilder('products')
      .leftJoinAndSelect('products.brand', 'brands')
      .leftJoinAndSelect('products.category', 'categories')
      .leftJoinAndSelect('products.productOptions', 'productOptions')
      .where('products.id = :id', { id })
      .getOne()
    

额外建议(可选)

为了避免后续再出现类似问题,可以加一层UUID格式校验:

  • 使用正则表达式验证字符串是否符合UUID格式
  • 借助uuid包的validate方法做校验,比如:
    import { validate } from 'uuid';
    
    if (!validate(actualUUID)) {
      throw new Error('Invalid UUID format');
    }
    

补充说明

TypeORM本身会自动将合法的字符串UUID转换为PostgreSQL的UUID类型,不需要你手动做类型转换——这次的错误完全是参数传递时的对象/字符串混淆导致的。

内容的提问来源于stack exchange,提问作者funtik

火山引擎 最新活动