[英]How to create a nested resolver in apollo graphql server
鉴于以下 apollo 服务器 graphql 模式,我想将它们分解为单独的模块,因此我不希望在根 Query 模式下的作者查询......并希望将其分开。 所以我在将它添加到根查询之前添加了另一个名为 authorQueries 的层
type Author {
id: Int,
firstName: String,
lastName: String
}
type authorQueries {
author(firstName: String, lastName: String): Author
}
type Query {
authorQueries: authorQueries
}
schema {
query: Query
}
我尝试了以下..您可以看到在指定作者函数之前将 authorQueries 添加为另一层。
Query: {
authorQueries :{
author (root, args) {
return {}
}
}
}
在Graphiql中查询时,我还添加了额外的层..
{
authorQueries {
author(firstName: "Stephen") {
id
}
}
}
我收到以下错误。
"message": "Resolve function for \\"Query.authorQueries\\" returned undefined",
要创建“嵌套”解析器,只需在父字段的返回类型上定义解析器。 在这种情况下,您的authorQueries
字段返回类型authorQueries
,因此您可以将解析器放在那里:
{
Query: { authorQueries: () => ({}) },
authorQueries: {
author(root, args) {
return "Hello, world!";
}
}
}
所以从技术意义上讲,没有嵌套解析器这样的东西——每个对象类型都有一个简单的字段列表,这些字段有返回类型。 GraphQL 查询的嵌套是结果嵌套的原因。
我发现父字段上的返回函数返回类型导致this
arg 被绑定,并破坏了解析器接口 b/c 嵌套解析器不是父作为第一个参数。
对于内联类型定义
import {
graphql,
} from 'graphql';
import {
makeExecutableSchema, IResolverObject
} from 'graphql-tools';
const types = `
type Query {
person: User
}
type User {
id: ID
name: String,
dog(showCollar: Boolean): Dog
}
type Dog {
name: String
}
`;
const User: IResolverObject = {
dog(obj, args, ctx) {
console.log('Dog Arg 1', obj);
return {
name: 'doggy'
};
}
};
const resolvers = {
User,
Query: {
person(obj) {
console.log('Person Arg 1', obj);
return {
id: 'foo',
name: 'bar',
};
}
}
};
const schema = makeExecutableSchema({
typeDefs: [types],
resolvers
});
const query = `{
person {
name,
dog(showCollar: true) {
name
}
}
}`;
graphql(schema, query).then(result => {
console.log(JSON.stringify(result, null, 2));
});
// Person Arg 1 undefined
// Dog Arg 1 { id: 'foo', name: 'bar' }
// {
// "data": {
// "person": {
// "name": "bar",
// "dog": {
// "name": "doggy"
// }
// }
// }
// }
您还可以使用addResolveFunctionsToSchema
如下面的要点所示。
https://gist.github.com/blugavere/4060f4bf2f3d5b741c639977821a254f
Apollo 官方相关文档(里面有很好的例子):
https://www.apollographql.com/docs/apollo-server/data/resolvers/#resolver-chains
/* code from: https://www.apollographql.com/docs/apollo-server/data/resolvers/#resolver-chains */ const { ApolloServer, gql } = require('apollo-server'); const libraries = [ { branch: 'downtown' }, { branch: 'riverside' }, ]; // The branch field of a book indicates which library has it in stock const books = [ { title: 'The Awakening', author: 'Kate Chopin', branch: 'riverside' }, { title: 'City of Glass', author: 'Paul Auster', branch: 'downtown' }, ]; // Schema definition const typeDefs = gql` # A library has a branch and books type Library { branch: String! books: [Book!] } # A book has a title and author type Book { title: String! author: Author! } # An author has a name type Author { name: String! } # Queries can fetch a list of libraries type Query { libraries: [Library] } `; // Resolver map const resolvers = { Query: { libraries() { // Return our hardcoded array of libraries return libraries; } }, Library: { books(parent) { // Filter the hardcoded array of books to only include // books that are located at the correct branch return books.filter(book => book.branch === parent.branch); } }, Book: { // The parent resolver (Library.books) returns an object with the // author's name in the "author" field. Return a JSON object containing // the name, because this field expects an object. author(parent) { return { name: parent.author }; } } // Because Book.author returns an object with a "name" field, // Apollo Server's default resolver for Author.name will work. // We don't need to define one. }; // Pass schema definition and resolvers to the // ApolloServer constructor const server = new ApolloServer({ typeDefs, resolvers }); // Launch the server server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.