Хм, первый подход SDL может быть немного хитрым.Не легко объяснить, что здесь не так, но я сделаю все возможное.Сначала позвольте мне рассказать вам, что нужно сделать, чтобы сделать эту работу, а затем я объясню, что идет не так.
Создайте поле IssueTrackerMutation
на карте распознавателя:
export default {
Query: {
ping: () => "ping!",
IssueTracker: () => ({ // same here but I will just do the mutation for you
ping: IssueTracker.ping,
}),
},
Mutation: {
ping: () => "ping!",
IssueTracker: () => null, // or whatever you want as a root here
},
IssueTrackerMutation: {
createIssue: IssueTracker.createIssue
}
};
Примечаниеразница между созданием «чистого» резольвера для IssueTracker и возвратом объекта для IssueTracker с методом createIssue
.
Теперь функция должна вызываться с ожидаемыми параметрами.Причина, по которой родительский аргумент отсутствует, заключается в особой реализации распознавателя по умолчанию.Средство распознавания предназначено для работы с объектно-ориентированным стилем, где поля могут быть полями или методами.Вы можете представить себе, что распознаватель будет работать так:
defaultResolver(fieldName, parent, args, context, info) {
if (typeof parent !== 'object') {
throw "Need object to default resolve";
}
if (typeof parent[fieldName] === 'function') {
return parent[fieldName](args, context, info);
}
return parent[fieldName];
}
Это позволит вам записывать объекты доступа к данным следующим образом:
class IssueTracker {
issues = []
async createIssue(args, ctx, info) {
const issue = await createIssue(args.request);
this.issues.push(issue);
return issue;
}
}
const issueTracker = new IssueTracker();
export default {
// ...
Mutation: {
// ...
IssueTracker: () => issueTracker,
},
IssueTrackerMutation: {
createIssue: IssueTracker.createIssue
}
};
Об этом не так уж много говорится.но, вероятно, относительно близко, как работает GraphQL в Facebook.Сообщество, кажется, продвигает больше логики в решатели.