使用NestJS+TypeORM查询PostgreSQL时name字段返回null如何解决
修复方案
1. 修正实体类字段类型适配null值
你当前ProductEntity实体的name字段仅声明为string类型,但你配置了nullable: true允许数据库存null值,TypeScript原生string类型不包含null,会导致TypeORM映射数据时出现类型异常,甚至自动过滤null值字段。
修改实体类代码如下:
@Entity('product') export class ProductEntity{ @PrimaryGeneratedColumn() id:number; // 修改类型为 string | null,适配数据库null值 @Column({ type:'text',nullable:true }) name:string | null; @Column({type:'timestamp',default:() => 'CURRENT_TIMESTAMP'}) createdAt:Date; }
2. 同步修正业务接口类型
你定义的Product接口name字段为可选类型,仅对应string | undefined,和实体、数据库的null值不匹配,需要同步修改:
//this is my model(interface) export interface Product { id?:number, // 新增null类型适配 name?:string | null, }
3. 检查序列化配置保留null值
如果你在NestJS中使用了ClassSerializerInterceptor做返回值序列化,框架默认会过滤值为null的字段,需要显式配置开启null值暴露:
// 在控制器或者全局注册拦截器时添加配置 @UseInterceptors(new ClassSerializerInterceptor(Reflector, { exposeNullValues: true }))
4. 检查查询语句是否包含name字段
如果你是用QueryBuilder做自定义查询,需要确认select语句中已包含name字段,否则不会返回该字段值,示例正确写法:
// 正确写法:显式指定需要返回的name字段 const products = await this.productRepository .createQueryBuilder('product') .select(['product.id', 'product.name', 'product.createdAt']) .getMany()
5. 确认实体与表结构同步
如果你修改过实体的nullable配置但未重新运行数据库迁移,会导致表结构和实体定义不一致,可重新生成并执行迁移同步结构:
# 生成迁移文件 npx typeorm-ts-node-commonjs migration:generate src/migrations/update-product-name-nullable -d src/data-source.ts # 执行迁移 npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts
内容的提问来源于stack exchange,提问作者Imesh Madushanka
相关产品推荐
相关产品推荐

