Nemůže vrátit hodnotu null pro non-možnou hodnotou null pole v mikro orm graphql

0

Otázka

Snažím se, aby Graphql server s Mikro-orm a mají problém.

Tady je můj Produkt.ts subjektu;

    import {
      Entity,
      IdentifiedReference,
      ManyToOne,
      PrimaryKey,
      Property
    } from '@mikro-orm/core'
    import { Field, Float, ObjectType } from 'type-graphql'
    import { ProductArguments } from '../util/types'
    import { Category } from './Category'
    
    @Entity()
    @ObjectType()
    export class Product {
      constructor({ title, price, description }: ProductArguments) {
        this.title = title
        this.price = price
        this.description = description
      }
    
      @Field()
      @PrimaryKey()
      id!: number
    
      @Field()
      @Property()
      title!: string
    
      @Field()
      @Property()
      imageUrl!: string
    
      @Field(() => Float)
      @Property({ type: 'decimal' })
      price!: number
    
      @Field(() => String)
      @Property({ type: 'text' })
      description!: string
    
      @Field(() => Category)
      @ManyToOne(() => Category)
      category!: IdentifiedReference<Category>
    
      @Field()
      @Property()
      createdAt: Date = new Date()
    
      @Field()
      @Property({ onUpdate: () => new Date() })
      updatedAt: Date = new Date()
    }

Tady je moje Kategorie.ts subjekt

  import {
    Cascade,
      Collection,
      Entity,
      LoadStrategy,
      OneToMany,
      PrimaryKey,
      Property
    } from '@mikro-orm/core'
    import { Field, ObjectType } from 'type-graphql'
    import { Product } from './Product'
    
    @Entity()
    @ObjectType()
    export class Category {
      constructor(title: string) {
        this.title = title
      }
    
      @Field()
      @PrimaryKey()
      id!: number
    
      @Field()
      @Property()
      title!: string
    
      @Field(() => [Product])
      @OneToMany({
        entity: () => Product,
        mappedBy: (product) => product.category,
        cascade: [Cascade.REMOVE],
        strategy: LoadStrategy.JOINED
      })
      products = new Collection<Product>(this)
    
      @Field()
      @Property()
      createdAt: Date = new Date()
    
      @Field()
      @Property({ onUpdate: () => new Date() })
      updatedAt: Date = new Date()
    }

V podstatě jsem mít one-to-many vztah s kategorie a produktu. Každý produkt by měl patřit do kategorie a kategorie může mít více výrobků.

Nyní ve své resolvery, snažím se dostat všechny kategorie, s následující.

   const categories = await em
      .createQueryBuilder(Category)
      .select('*')
      .getResult()
    return em.populate(categories, ['products'])

To funguje naprosto v pořádku. Žádné chyby. Ale když jsem se pokusit se získat všechny produkty s jejich kategorií, jako je následující:

   const products = await em
      .createQueryBuilder(Product)
      .select('*')
      .getResult()
    return em.populate(products, ['category'])

Nebo s left join

   return em
      .createQueryBuilder(Product, 'p')
      .select('*')
      .leftJoinAndSelect('p.category', 'c')
      .getResultList()

Jsem dostal následující chybu Tady je vygenerovaný dotaz.

vyberte "p".*, "c"."id" jako "c__id", "c"."název" jako "c__title", "c"."created_at" jako "c__vytvořen_v", "c"."updated_at" jako "c__aktualizován_v" z "výrobku" jako "p" left join "skupiny" jako "c" na "p"."category_id" = "c"."id"``

Také jsem se snažil ke spuštění tohoto dotazu v databázi a mám skutečný výsledek, který jsem chtěl. Ale v graphql, dostanu následující chybu. Co dělám špatně?

  {
      "message": "Cannot return null for non-nullable field Category.title.",
      "locations": [
        {
          "line": 11,
          "column": 7
        }
      ],
      "path": [
        "products",
        0,
        "category",
        "title"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "Error: Cannot return null for non-nullable field Category.title.",
express-graphql graphql mikro-orm orm
2021-11-24 04:40:03
1

Nejlepší odpověď

0

Pro každého, kdo má stejný problém jako já, podívejte se na tyto řádky

  @Field(() => Category)
  @ManyToOne(() => Category)
  category!: IdentifiedReference<Category>

Neměl jsem součástí IdentifiedReference bez porozumění to správně jako první. Od docs,

IdentifiedReference je křižovatka typu, že přidá primární klíč vlastnost Referenčního rozhraní. To umožňuje získat primární klíč od Referenčního stupně přímo.

V podstatě to, co se tady stalo, je, že jsem dostal odkaz na primární klíč tabulky produktu. Ale já byl přístup na název vlastnost z něj. Tam je getProperty funkce k získání majetku/databáze-pole ze to thouth. Ale nahrazení kódu, jako je následující vyřešil můj problém.

  @Field(() => Category)
  @ManyToOne(() => Category)
  category!: Category

Můžete sledovat náš github diskuse tady.

2021-11-25 15:49:24

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................