使用 typeorm 和 type-graphql 从 DB 检索数据时出错

Posted

技术标签:

【中文标题】使用 typeorm 和 type-graphql 从 DB 检索数据时出错【英文标题】:Error retrieving data from DB using typeorm and type-graphql 【发布时间】:2021-08-06 04:13:12 【问题描述】:

我将 type-graphql 与 typeorm、apollo-server-express 和 postgreSQL 结合使用。我在 1:n 关系中有一个用户和一个客户实体,这意味着一个用户可以有多个客户。

我可以很好地创建用户和客户,但是当我尝试使用 Apollo Server Playground 检索与客户关联的用户时,我收到一条错误消息,指出“无法为不可为空的字段 Customer.user 返回 null。”

当我检查数据库时,客户表上的关联用户 id 肯定不为空(见附图)。

query 
  customers 
    customerId
    customerName
    user       
      userId    
             
  

有谁知道我做错了什么?

User.ts

import  Field, ID, ObjectType  from "type-graphql";
import  BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn  from "typeorm";
import  Customer  from "./Customer";

@ObjectType()
@Entity("users")
export class User extends BaseEntity 
    @Field(() => ID)
    @PrimaryGeneratedColumn("uuid")
    userId: string;

    @Field()
    @Column( unique: true )
    email: string;

    @Column( nullable: false )
    password: string;

    @Field(() => Customer)
    @OneToMany(() => Customer, customer => customer.user)
    customers: Customer[]

Customer.ts

import  Field, ID, ObjectType  from "type-graphql";
import  BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn  from "typeorm";
import  User  from "./User";


@ObjectType()
@Entity("customers")
export class Customer extends BaseEntity 
    @Field(() => ID)
    @PrimaryGeneratedColumn("uuid")
    customerId: string;

    @Field()
    @Column()
    customerName: string;

    @Field(() => User)
    @ManyToOne(() => User, user => user.customers)
    user: User;

CustomerResolver.ts

export class CustomerResolver 
    @Query(() => [Customer])
    async customers():Promise<Customer[]> 

        try 
            return await Customer.find();
         catch (error) 
            console.log(error);
            return error;
        
    
....

设置/版本

节点:v14.17.0 “apollo-server-express”:“^2.24.0”, "type-graphql": "^1.1.1", “typeorm”:“0.2.32” postgreSQL:13.2

【问题讨论】:

【参考方案1】:

您应该编写一个@FieldResolver,它将根据根user 数据获取customers。 https://typegraphql.com/docs/resolvers.html#field-resolvers

【讨论】:

非常感谢,我试试看。【参考方案2】:

在您的解析器中更改find 操作,如下所示:

return Customer.find(
  relations: ["user"]
);

【讨论】:

以上是关于使用 typeorm 和 type-graphql 从 DB 检索数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

对 Type-graphql 和 Typeorm 实体中的外键字段使用 ID 标量类型在语义上是不是正确?

如何将“typeorm”模型转换为 graphql 有效负载?

type-graphql 找不到模块“类验证器”异常

如何在typeorm中查找id的数组属性包含某个id的实体

在 TypeORM 与 GraphQL 的多对多关系上使用数据加载器,查询多对多

无法确定名为参数的 GraphQL 输入类型