如何使用 apollo graphQL 拼接模式?

How to stitch schemas using apollo graphQL?

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

     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. 我可以在 Post 回复中提供评论详情吗?

    { "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. 我基本上需要使用以下算法

      • 获取所有评论
      • 使用给定的 postId
      • 过滤评论
      • 从解析器函数
      • 收集所有匹配的评论和return

      下面是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 点)。

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

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

这就是 "Expected Iterable" 错误的原因。

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

在猫鼬中它会像

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

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

  1. response.filter 重新调整数组,因为我正在寻找具有特定 post id 的注释数组,所以将条件放入 map 函数中很有帮助。
  2. dataSources.mvrpAPI.getAllComments() 给出 Promise 。为了获得真实的对象,我使用了 "await" 并且由于 await 只能从异步函数中使用,所以我将注释函数设为异步。

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