我最近开始使用 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 传递一个用户对象,但我从一个简单的案例开始,看看它是如何工作的
谢谢