簡體   English   中英

如何創建可以“完成”類型的 GraphQL 解析器

[英]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.

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