【问题标题】:Graphql: Can't get args passed in extended typeGraphql:无法获取以扩展类型传递的参数
【发布时间】:2020-11-10 20:00:55
【问题描述】:

所以我对 graphql 有点陌生,我遇到了一个我不知道如何解决的问题。 我正在使用 nodeJs 和 apollo。

我有一个用户类型的个人资料微服务:

type User @key(fields: "_id") {
  ${userFields}
}

我还有一个进度微服务,我在其中扩展了用户类型:

extend type User @key(fields: "_id") {
  _id: ID! @external,
  progression: Progression
}

type Progression {
  currentGOTW: Int,
  totalGOTW: Int,
  video(playlistId: String!, itemIndex: Int!): [Int]
}

如您所见,我扩展了 User 类型以添加​​ Progression 字段,问题来自需要两个参数的 video 字段。

进度解析器如下所示:

User: {
  async progression (user, data) {
    console.log(data)
    const videoProgression = await UserWatched.get({ playlist_id: data.playlistId, item_index: data.itemIndex, userRef: user._id })
    return videoProgression
  }
}

在这个解析器中,我希望在数据中获得 playlistId 和 itemIndex,但是当我 console.log 时,数据是空的。我没有任何错误,我尝试在解析器函数中显示数据之后的参数,但它们也不包含我想要的。

这是我的查询:

const query = gql`
{
  User {
    progression {
      video(playlistId: "playlist", itemIndex: 3)
    }
  }
}`

我需要在解析器中获取“播放列表”和 3。

我没有找到任何答案,我开始认为现在可能不可能......

【问题讨论】:

    标签: graphql


    【解决方案1】:

    首先,我不确定您的初始查询是否正确(也许这些示例中缺少一些代码)。您正在尝试使用此查询用户,

    {
      User {
        ...
      }
    }
    

    但您必须为此步骤定义“根查询”。每个模式中都有一个查询(和突变)类型,这是您放置根级别查询的地方。这是您想要的示例,

    ...
    type Query {
      user(id: ID!): User!
    }
    

    然后类似地,您将定义一个解析器以通过 id 检索此用户。它可能看起来像这样,

    Query: {
      user(source, args, context) {
        return context.dataSources.getUserById(args.id)
      }
    }
    

    所以现在您可以为您的用户进行根级查询。第二个问题是您正试图访问一个解析器的参数执行太低。您正在尝试在 User.progression 解析器中使用传递给 Progression.video 解析器的参数。相反,您需要修改架构,以便 User.progression 解析器拥有这些参数。

    extend type User @key(fields: "_id") {
      _id: ID! @external,
      progression(playlistId: String!, itemIndex: Int!): Progression
    }
    

    您的最终查询应该与此类似,

    const query = gql`
      query GetUser($id: ID!, $playlistId: String!, $itemIndex: Int!) {
        user(id: $id) {
          progression(playlistId: $playlistId, itemIndex: $itemIndex) {
            video
          }
        }
      }`
    

    这绝对不是不可能的!你只需要习惯 GraphQL。祝你好运!

    【讨论】:

    • 嗨 Nicholas,感谢您的回复 :)。对于用户解析器的第一部分,我已经完成了,我应该在我的帖子中展示它。对于我已经考虑过的解决方案,但如果我可以直接在视频字段中传递参数,我觉得它“更漂亮”,因为并非所有正在进行的字段都需要 playlistId 和 itemIndex。但我想我别无选择:x 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2018-02-16
    相关资源
    最近更新 更多