簡體   English   中英

GraphQL代碼中的Javascript循環依賴

[英]Javascript circular dependency in GraphQL code

我是Javascript的新手,不知道如何解決這個問題。 我正在創建一個GraphQL服務來為數據庫提供查詢,我想定義三種類型:Person,Company和Relationship

type Relation: {
  person: Person
  company: Company
}

type Person: {
  relationship: Relation
}

type Company: {
  relationship: Relation
}

正如你所看到的,它們是相互依賴的,我會得到人和公司undefined ,有沒有辦法解決這個問題?

數據庫架構:

// -------------------- Object(company) --------------------
objectType = new GraphQLObjectType ({
  name: 'Object',
  description: 'Object could be a Company, FinancialOrg, Person or Product.',
  fields: {
    id: {
      type: new GraphQLNonNull(GraphQLString),
    },
    entity_type: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'could be Company, FinancialOrg, Person or Product.'
    },
    entity_id: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    parent_id: {
      type: GraphQLString,
    },
    name: {
      type: new GraphQLNonNull(GraphQLString),
    },
    normalized_name: {
      type: new GraphQLNonNull(GraphQLString),
    },
    permalink: {
      type: new GraphQLNonNull(GraphQLString),
    }
  },
  resolveType: function(object) {
    return dbHandler.findObjectById(object.id);
  }
})

// -------------------- Relationship --------------------
var relationshipType = new GraphQLObjectType({
  name: 'Relationship',
  description: 'Describe the relationship between a person and a object(Corporation, fund)',
  fields: {
    id: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    relationship_id: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    person_object_id: {
      type: new GraphQLNonNull(GraphQLString),
    },
    relationship_object_id: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'A Corporation or a Fund',
    },
  }
});

// -------------------- Person Type --------------------
personType = new GraphQLObjectType ({
  name: 'Person',
  fields: {
    id: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    object_id: {
      type: new GraphQLNonNull(GraphQLString),
    },
    first_name: {
      type: new GraphQLNonNull(GraphQLString),
    },
    last_name: {
      type: new GraphQLNonNull(GraphQLString),
    },
    birthplace: {
      type: GraphQLString
    },
    affiliation_name: {
      type: GraphQLString
    },
  },
});

通常,您不會定義特殊的關系類型。 在GraphQL中,類型之間的關系在類型本身中定義。

例如,在您的personType ,您可以擁有一個名為companies的字段,該字段可解析為該人所屬的公司( companyType )列表。 在您的companyType ,您可以類似地定義將解析為personType列表的字段people

這將基本上為您提供兩種類型之間的多對多關系,這聽起來像是在數據庫中定義的。

此樣式中的personType可能如下所示:

personType = new GraphQLObjectType ({
  name: 'Person',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    companies: {
      type: new GraphQLList(companyType),
      resolve: person => dbHandler.getAssociatedCompanies(person.id),
      },
    },
  }),
});

至於循環依賴問題,請注意上面的內容,而不是使用fields的對象字面值,您可以使用返回對象的函數,這不會導致任何問題(盡管你的linter可能會抱怨)。

我肯定建議您閱讀GraphQL類型 ,並確保為您的字段選擇了合適的類型。 一旦你足夠舒服,你肯定想要研究GraphQLInterfaceType ,它允許你定義其他類型可以實現的公共字段。 最終,它可能是一個更好的途徑,分別定義您的類型,讓它們實現一個接口,而不是具有通用的objectType

另請注意, resolveType可能不會執行您認為的操作。 從GraphQL類型:“[resolveType is]是一個函數,用於確定解析字段時實際使用的類型。” 您可以看到GraphQL類型可以由多種類型組成,例如GraphQLInterfaceTypeGraphQLUnionType

星球大戰的例子幫助我繞過這些東西。

嘗試將GraphQL端點重構為類似的東西

type Person: {
  employers: [Company],
  ...personAttributes
}

type Company: {
  employees: [Person],
  ...companyAttributes
}

在數據庫模式中(我猜你使用的是關系數據庫),你需要3個表:

  • 公司
  • 關系

本文將介紹如何建模多對多關系,例如您擁有的關系。

注意:如果一個人一次只能在一家公司工作,那么架構就會簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM