1

我最近开始使用 apollo/graphql 为我的项目开发一个 api,并将 mongodb 作为我的后端数据库。我已经按照阿波罗网站https://www.apollographql.com/docs/graphql-tools/schema-stitching.html上的本教程 开发了一个合并模式,这样我就可以编写连接不同模式的查询。该教程说要根据您的个人模式创建可执行模式

//ExecutableSchemas     
const postSchema  = makeExecutableSchema({
                typeDefs: PostSchema,
     });

    const usersSchema = makeExecutableSchema({
                typeDefs: UsersSchema,

    }); 

我也有针对我测试和工作的各个模式的解析器

//Resolvers merged using lodash 
const resolverK= merge(PostResolver, UsersResolver);

然后我使用应该返回用户的作者属性扩展了帖子模式

// Extend schema with new fields
const linkTypeDefs = `
    extend type Post {
        author: Users
    }

`;

合并后的模式将从 Post typeDef 中获取 userID,并将其通过管道传递到用户解析器函数 (userByID) 以获取与该 Post 相关的用户数据

type Post {
  _id: String
  topic: String
  userid: String
}

//Final Schema 
module.exports = mergeSchemas({
        schemas: [postSchema, usersSchema, linkTypeDefs],
        resolvers: mergeInfo => (

            {
           Post: {
            author: {
              fragment: `fragment PostFragment on Post { userid }`,
              resolve(parent, args, context, info) {
                const id = parent.userid;
                return mergeInfo.delegate(
                  'query',
                  'userByID',
                  {
                    id,
                  },
                  context,
                  info,
                );
              },
            },
          },
        }, 
         resolverK //resolvers for my individual schemas
        ),

      });

所以当我在 graphiql 中运行查询时

{
  getPost(id:"5ab7f6adaf915a1d2093fa48"){
     _id
     topic
    userid
    author{
      name
    }
  }
}

//输出

{
  "data": {
    "getPost": {
      "_id": "5ab7f6adaf915a1d2093fa48",
      "topic": "Some random post topic",
      "userid": "5ab7bf090b9b1a0a5cd3f6db",
      "author": null
    }
  }
}

我为作者得到一个空值。它似乎没有为用户执行我的解析器功能,因为我已经单独测试过它并且一直在工作。它可能是用户的解析器,并且显示为“resolverk”的发布模式覆盖了合并解析器,因为所有其他查询和突变都有效,但我不完全确定。

const UsersResolver = {
    Query: {

      userByID: async (parent, { id }, { UsersModel }) => {
                        //Retrieve User from mongodb  
                       const user  = await UsersModel.findById(id); 
                       return user; 
      }

    },

    Mutation: {
       ...


    }



  }

我知道我可以简单地为 Post typeDef 而不是 userid 传递一个用户对象,但我从一个简单的案例开始,看看它是如何工作的

谢谢

4

0 回答 0