0

我是一名学习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. 我需要基本上使用以下算法

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

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

4

2 回答 2

1

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

  1. response.filter 重新调整了一个数组,并且由于我正在寻找一组具有特定帖子 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);
         }
      },   
    
于 2020-05-22T17:22:17.937 回答
0

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

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

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

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

在猫鼬中,它会像

async (post,_, {model}) => model.Comment.find({postId: post.id})
于 2020-05-21T13:10:51.607 回答