问题描述
给定以下Apollo Server GraphQL模式 我想将它们分解为单独的模块,因此我不希望作者在根部查询模式下查询.因此,我在将其添加到root查询
之前添加了另一个名为Wuturenderies的层.type Author { id: Int, firstName: String, lastName: String } type authorQueries { author(firstName: String, lastName: String): Author } type Query { authorQueries: authorQueries } schema { query: Query }
我尝试了以下内容.您可以看到在指定作者函数之前,添加了作者Quereteries作为另一层.
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查询的嵌套是使结果嵌套的原因.
其他推荐答案
Apollo官方相关文档( Great 内部示例):
解析器链
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}`); });
其他推荐答案
我发现,在父字段上返回函数返回类型在this arg中绑定了绑定,并破坏了嵌套的解析器不是parent作为第一个参数.
用于内联类型定义
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/4060F4BF2F2F2F2F3D5B741C63999778254F" nore="nore="norefollow norefollow norefollow norefollow norefloll
问题描述
Given the following apollo server graphql schema I wanted to break these down into separate modules so I don't want the author query under the root Query schema.. and want it separated. So i added another layer called authorQueries before adding it to the Root Query
type Author { id: Int, firstName: String, lastName: String } type authorQueries { author(firstName: String, lastName: String): Author } type Query { authorQueries: authorQueries } schema { query: Query }
I tried the following.. you can see that authorQueries was added as another layer before the author function is specified.
Query: { authorQueries :{ author (root, args) { return {} } } }
When querying in Graphiql, I also added that extra layer..
{ authorQueries { author(firstName: "Stephen") { id } } }
I get the following error.
"message": "Resolve function for \"Query.authorQueries\" returned undefined",
推荐答案
To create a "nested" resolver, simply define the resolver on the return type of the parent field. In this case, your authorQueries field returns the type authorQueries, so you can put your resolver there:
{ Query: { authorQueries: () => ({}) }, authorQueries: { author(root, args) { return "Hello, world!"; } } }
So in the technical sense, there is no such thing as a nested resolver - every object type has a flat list of fields, and those fields have return types. The nesting of the GraphQL query is what makes the result nested.
其他推荐答案
Apollo Official related docs (Great example inside):
Resolver chains
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}`); });
其他推荐答案
I found that returning functions on the parent fields return type results in the this arg being bound, and breaks the resolver interface b/c the nested resolver doesn't the parent as the first argument.
For inline type definitions
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" // } // } // } // }
You can also use addResolveFunctionsToSchema as seen in the below gist.
https://gist.github.com/blugavere/4060f4bf2f3d5b741c639977821a254f