Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在apollo graphql服务器中创建嵌套解析器_Graphql_Apollostack_Apollo Server - Fatal编程技术网

如何在apollo graphql服务器中创建嵌套解析器

如何在apollo graphql服务器中创建嵌套解析器,graphql,apollostack,apollo-server,Graphql,Apollostack,Apollo Server,给定以下apollo服务器graphql模式 我想将它们分解为单独的模块,因此我不希望在根查询模式下使用author查询。。我想把它分开。因此,在将其添加到根查询之前,我添加了另一个名为authorQueries的层 type Author { id: Int, firstName: String, lastName: String } type authorQueries { author(firstName: String, lastName: Strin

给定以下apollo服务器graphql模式 我想将它们分解为单独的模块,因此我不希望在根查询模式下使用author查询。。我想把它分开。因此,在将其添加到根查询之前,我添加了另一个名为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是在指定author函数之前作为另一层添加的

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://www.apollographql.com/docs/apollo-server/data/resolvers/#resolver-锁链
*/
const{apollo-server,gql}=require('apollo-server');
常量库=[
{
分行:“市区”
},
{
分支:“河边”
},
];
//一本书的分支字段表示哪个图书馆有它的存货
常数书=[
{
标题:"觉醒",,
作者:《凯特·肖邦》,
分支:“河边”
},
{
标题:“玻璃之城”,
作者:《保罗·奥斯特》,
分行:“市区”
},
];
//模式定义
常量typeDefs=gql`
#图书馆有一个分馆和几本书
类型库{
分支:字符串!
书:[书!]
}
#书有书名和作者
打字簿{
标题:字符串!
作者:作者!
}
#作者有名字
打字机{
名字:字符串!
}
#查询可以获取库的列表
类型查询{
图书馆:[图书馆]
}
`;
//分解器映射
常量解析程序={
查询:{
图书馆(){
//返回库的硬编码数组
归还图书馆;
}
},
图书馆:{
书籍(家长){
//筛选硬编码的书籍数组,使其仅包含
//位于正确分支的书籍
返回books.filter(book=>book.branch===parent.branch);
}
},
书籍:{
//父解析器(Library.books)返回具有
//“author”字段中的作者姓名。返回包含
//名称,因为此字段需要对象。
作者(家长){
返回{
姓名:parent.author
};
}
}
//因为Book.author返回一个带有“name”字段的对象,
//Apollo服务器的Author.name默认解析程序将正常工作。
//我们不需要定义一个。
};
//将架构定义和解析器传递给
//阿波罗服务器构造函数
const server=new ApolloServer({typeDefs,resolvers});
//启动服务器
server.listen().then({url})=>{

console.log(`难道没有更好的方法,比如为author类型定义一个解析器,它使用过度给定的根参数的一些值吗?当我这样做时,我已经为每次在其他类型中使用author时都创建了一个解析器Yep,您需要为每个返回author的字段定义一个解析器,至少在当前的GraphQL实现中是这样将来会更好。我喜欢你关于GraphQL没有“嵌套”的观点解析程序。我已经阅读了很多文档,直到我意识到..这对深度>1不起作用。只能为查询返回的类型上的属性定义解析程序,不能为这些属性上的属性定义解析程序。除非我遗漏了什么,否则在执行时这是一个主要的性能问题不必对每个请求都进行计算。相关阿波罗文档: