Graphql类型解析器ID

时间:2020-10-08 17:45:18

标签: graphql graphql-js

我试图通过构建具有以下架构的服务器来熟悉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的文档)中找不到任何类似的东西。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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