[英]How to create a GraphQL resolver that can ‘complete’ a type
假設我們有一個突變,它返回一個只有屬性id
的對象數組。 為了“完成”這個類型,我們必須為這個對象的每個屬性創建一個解析器。
相反,我希望能夠創建一個可以完成對象的解析器。
下面是一個查詢示例,該查詢發送英雄列表和最喜歡的英雄的突變。 mutation setFavorite(id)
的解析器僅返回IDs
列表。
type Query {
heroes(first: Int = 10) [Hero]
}
type Hero {
id: ID!
title: String!
}
type Mutation {
setFavorite(id: ID!): [Hero]
}
const resolvers = {
Query: {
heroes(_, {first}, {heroes}) {
return heroes.get({first});
}
},
Mutation: {
setFavorite(_, {id}, {favorites}) {
await favorites.setFavorite(id);
return favorites.getAll(); // <<<< these are only IDs
}
}
}
const resolvers = {
Hero: {
// vvvvvv something like this
__type(parent, _, {heroes}) {
if (parent.id) {
return heroes.getOne({id: parent.id});
}
}
}
}
只有字段被解析,所以你只能為字段編寫解析器,而不是類型。 您的選擇是:
更改getAll
方法以實際返回相關模型的實例,而不僅僅是返回 ID。
將返回的 ID 映射到每個解析器內的模型實例。
為每個子字段編寫一個解析器:
const resolvers = {
Hero: {
title: (id, args, ctx) => {
const hero = await ctx.dataloaders.hero.findById(id)
return hero.title
},
someOtherField: (id, args, ctx) => {
const hero = await ctx.dataloaders.hero.findById(id)
return hero.someOtherField
},
},
}
請注意,我們在此示例中使用了dataloader 。 這讓我們可以批量調用findById
並避免為相同的 id 調用該方法兩次。 你不應該在沒有 DataLoader 的情況下使用這種模式; 否則,您最終會對數據庫進行不必要的額外調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.