如何在apollo graphql服务器中创建嵌套解析器
给定以下apollo服务器graphql模式 我想将它们分解为单独的模块,因此我不希望在根查询模式下使用author查询。。我想把它分开。因此,在将其添加到根查询之前,我添加了另一个名为authorQueries的层如何在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
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不起作用。只能为查询返回的类型上的属性定义解析程序,不能为这些属性上的属性定义解析程序。除非我遗漏了什么,否则在执行时这是一个主要的性能问题不必对每个请求都进行计算。相关阿波罗文档: