【问题标题】:How to stitch schemas using apollo graphQL?如何使用 apollo graphQL 拼接模式?
【发布时间】:2020-09-07 07:34:18
【问题描述】:

我是一名学习graphQL的java程序员。我有如下示例的数据集,其中评论有 postId,但帖子没有评论信息。

     comments
     {
        "postId": 1,
        "id": 1,
        "name": "id labore ex et quam laborum",
        "email": "Eliseo@gardner.biz",
        "body": "laudantium enim quasi"
      }

    post
      {
        "userid": 3,
        "id": 1,
        "title": "Post 1"
      }

使用阿波罗联盟

  1. 我可以在帖子回复中提供评论详细信息吗?

    { "data": { "posts": [ { "userid": 3, "id": 1, "title": "Post 1" "comments": { "id": 1, "name": "id labore ex et quam laborum", "email": "Eliseo@gardner.biz", "body": "laudantium enim quasi" } } ] }

    1. 我基本上需要使用以下算法

      • 获取所有 cmets
      • 使用给定的 postId 过滤 cmets
      • 收集所有匹配的 cmets 并从解析器函数返回

      下面是post.js代码

       type Post @key(fields: "id"){
           id: ID!
           userid: Int!
           title: String!
           comments: [Comment]
         }
      
         extend type Comment @key(fields: "id" ){
             id: ID! @external
         }
      
        const resolvers = {
          Post: {
              comments(post){
                return ( { __typename: "Post",  postId:post.id });
             }
      
         Query: {
              post: (root, { id }, { dataSources }) => dataSources.mvrpAPI.getAPost(id),
             posts: (root, args, { dataSources }) => dataSources.mvrpAPI.getAllPosts()}
      

使用上述解析器的评论方法,我得到以下错误

  "message": "Expected Iterable, but did not find one for field
 \"Post.comments\".",

然后我尝试了下面的解析器方法,但它无法识别 mvrpAPI,即使它在解析器的查询部分工作

     async comments(post, {dataSources}){
      const allComments =  dataSources.mvrpAPI.getAllComments();;

      return allComments.postId.findAll(
        { __typename: "Post",  postId:post.id }
      );
    }
    }

有人可以帮助如何在 graphql 中编写上述逻辑(在第 2 点中)。

【问题讨论】:

    标签: node.js graphql graphql-js apollo-federation


    【解决方案1】:

    这是我解决上述问题的方法

    1. response.filter 会重新调整一个数组,并且由于我正在寻找一个具有特定帖子 ID 的 cmets 数组,因此只需将条件放入 map 函数即可。
    2. dataSources.mvrpAPI.getAllComments() 给出 Promise 。为了获得真正的对象,我使用了“await”,因为 await 只能从异步函数中使用,所以我将 cmets 函数设为异步。

      async comments(post, {postid}, {dataSources}){
           const response =  await dataSources.mvrpAPI.getAllComments();
             return response.filter(comment => comment.postId === post.id);
           }
        },   
      

    【讨论】:

      【解决方案2】:

      您将 cmets 声明为 Post 架构上的列表,而在解析器上您将返回单个对象

      return ({ __typename: "Post", postId:post.id });

      这就是“预期可迭代”错误的原因。

      我不熟悉那个数据库 api,但这对于大多数 api 来说应该不难。

      在猫鼬中它会像

      async (post,_, {model}) => model.Comment.find({postId: post.id})
      

      【讨论】:

      • 感谢您的回复加布里埃尔。你是对的 return ({ __typename: "Post", postId:post.id });返回单个对象。我在下面的评论中发现了问题并发布了解决方案。再次感谢
      猜你喜欢
      • 2018-04-23
      • 2021-12-03
      • 2021-10-30
      • 2018-11-08
      • 2020-10-10
      • 2019-06-22
      • 2018-12-27
      • 2019-06-26
      • 2019-03-01
      相关资源
      最近更新 更多