【问题标题】:Graphql type resolver by idGraphql 类型解析器(按 id)
【发布时间】:2021-01-23 19:45:11
【问题描述】:

我正在尝试通过构建具有以下架构的服务器来熟悉 Graphql:

type Game
{
    id: ID!
    players: [Player!]!
    winner: Player
    ...
}

type Player {
    id: ID!
    game: Game!
    ...
}

type Query {
    getGame(id: ID!): Game
    getPlayer(id: ID!): Player
}

并映射到以下数据:

const games = {
    1: {
        id: 1,
        players: [2, 3],
        winner: undefined
    }
};
const players = {
    2: {
        id: 2,
        game: 1
    },
    3: {
        id: 3,
        game: 1
    },
};

在编写解析器时,我注意到很多样板代码 - 我必须在概念上为每个拥有外键的对象成员编写相同的字段解析器。

const typedefs = {
    Query: {
        getGame: (_, {id}) => games[id],
        getPlayer: (_, {id}) => players[id]
    },
    Game: {
        winner: (game) => players[game.winner],
        players: (game) => game.players.map(id => players[id])
    },
    Player: {
        game: (player) => games[player.id]
    }
}

有没有办法通过 ID 创建类型解析器? 例如,Player 字段或查询将始终由 (id) => players[id] 解析, 并且游戏字段或查询将始终由 (id) => games[id] 解决。

我看到使用 AWS-Amplify 的 @model 指令可以实现这一点,但我想知道是否有一种更标准的方式我缺少而不是实现我自己的指令。

这是任何当前 Graphql 实现的特性吗?我在 apollo-graphql 的文档(或 graphql-js 的)中找不到任何类似的东西。

谢谢。

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    无法更改默认解析器。 Apollo-GraphQL 只是将解析器映射传递给graphql-tools,而graphql-tools 使用graphql-jsgraphql-js 实现默认解析器 here 并使用它 here

    也许您可以尝试使用 ES2015 Proxy 为对象中的解析器提供默认实现。但是,即使您覆盖了默认解析器,也会破坏您使用实际默认解析器的所有位置。

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 2020-10-04
      • 2017-08-13
      • 2021-08-22
      • 2020-03-17
      • 2021-09-02
      • 2019-11-06
      • 2020-05-12
      • 2021-03-12
      相关资源
      最近更新 更多