[英]GraphQL: How to reuse same type for query and mutation?
假設我有一個這樣定義的查詢:
type Query {
# The basic me query
getUser(id:Int): [User]
}
type User {
id: ID!
login: String!
name: String
}
但是現在我需要進行突變才能添加用戶。 我的直覺是像這樣:
type Mutation {
addUser(newUser: User): [User]
}
但這是行不通的,因為突變不能使用“查詢類型”。 它需要使用“輸入類型”。 我知道在此示例中,這並不是很復雜,但是如果user是一個非常復雜的類型,並且使用了許多子類型。 我怎樣才能做到這一點? 是否有一個將類型重新用作變異參數的方法?
不幸的是,不能使用type
代替input
,並且不能使用input
代替type
。 這是設計使然。 根據官方規格 :
字段可以定義客戶端隨查詢傳遞的自變量,以配置其行為。 這些輸入可以是字符串或枚舉,但是有時它們需要比這更復雜。
上面定義的對象類型不適合在此處重復使用,因為對象可以包含表示循環引用或對接口和聯合的引用的字段,這兩種都不適合用作輸入參數。 因此,輸入對象在系統中具有單獨的類型。
此外, GraphQLObjectType
上的GraphQLObjectType
可以具有args和resolve函數,而GraphQLInputObjectType
上的GraphQLInputObjectType
則沒有(但它們具有默認值,前者不可用)。
將它們與實現觀點分開也是有意義的。 簡單的模式可能只是將字段映射到某些表中的列。 但是,在實際的應用程序中,很有可能您將獲得不映射到任何一列的派生字段(並且不適合在輸入中使用)。
您也可能只希望將某些字段用作輸入(例如,如果要添加用戶,則客戶端不應該向您發送id;這應該由添加用戶時的db生成)。 同樣,您可能不想公開用作客戶端輸入的每個字段,僅公開它們實際需要的那些字段。
如果沒有其他問題,則您在輸入和返回類型之間使用non-null
可能會有所不同。
也就是說,有一種解決方法。 至少在graphql-js中。 如果以編程方式聲明架構,則可以使用一組字段分別定義一個Object,然后為User
和UserInput
對象設置fields
屬性。 另外,如果您以聲明方式定義架構(例如在示例中),則可以使用如下模板文字:
const userFields = `
id: ID!
login: String!
name: String
`
const schema = `
type User {
${userFields}
}
type UserInput {
${userFields}
}
`
哎呀,如果您願意,甚至可以遍歷每個定義的類型並以編程方式創建一個匹配的輸入類型。 但是,IMO在考慮靈活性成本時可能不值得為實施這些變通辦法而付出的努力。 咬緊牙關,對您實際需要的內容進行一些思考,以作為該突變的輸入,並僅指定您需要的字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.