[英]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類型可以由多種類型組成,例如GraphQLInterfaceType
和GraphQLUnionType
。
星球大戰的例子幫助我繞過這些東西。
嘗試將GraphQL端點重構為類似的東西
type Person: {
employers: [Company],
...personAttributes
}
type Company: {
employees: [Person],
...companyAttributes
}
在數據庫模式中(我猜你使用的是關系數據庫),你需要3個表:
注意:如果一個人一次只能在一家公司工作,那么架構就會簡單得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.