Недавно я начал использовать apollo / graphql для разработки api для моего проекта и mongodb в качестве моей базы данных. Я следил за этим руководством на веб-сайте apollo 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 и направит его в функцию распознавателя пользователей (userByID), чтобы получить данные пользователя, относящиеся к этой публикации.
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 вместо идентификатора пользователя, но я начинаю с простого случая, чтобы увидеть, как он работает, который мне понадобится, поскольку мое веб-приложение становится более сложным, и я избегаю переписывания материала позже
Благодарность





IMHO слияние было ненужным - вы могли включить резолверы в makeExecutables или предоставить их отдельно (массив резолверов) в слиянии.