GraphQL 字段的解析器没有被调用

Posted

技术标签:

【中文标题】GraphQL 字段的解析器没有被调用【英文标题】:GraphQL field's resolver not getting called 【发布时间】:2017-06-03 08:00:15 【问题描述】:

我正在使用 apollo-server 并在我的浏览器中使用 GraphiQL 进行测试。我根据 Apollo 的 GitHunt-API example 设置了我的解析器,但是“review.extraStuff”字段上的解析器永远不会被调用。

解析器

const rootResolvers = 
    review(root, args, context) 
        console.log('resolving review');
        return 'HasErrors': true
    


const extraStuff = (root, args, context) => 
    console.log('resolving extraStuff');
    return "yes";


rootResolvers.review.extraStuff = extraStuff;

export default 
    RootQuery: rootResolvers
;

架构

const Review = `
    type Review 
        HasErrors: Boolean
        extraStuff: String
    
`

const RootQuery = `
    type RootQuery 
        review(id: String!): Review
    
`;

const SchemaDefinition = `
    schema 
        query: RootQuery
    
`;

GraphiQL 查询结果

附加信息

我知道 Apollo 知道我的 extraStuff 解析器,因为如果我将“requireResolversForNonScalar”设置为 true,我不会收到消息告诉我 extraStuff 缺少解析函数。我已将日志记录添加到架构和 apolloExpress 中间件中,但什么也没学到。

【问题讨论】:

extrastuff 是一个字符串,因此是一个标量 那么,您是说“requireResolversForNonScalar”无法捕捉到它?这是有道理的。 @w00t 想详细说明一下吗?我正在查看 graphql-tools 源代码,因为我的问题似乎出在 makeExecutableSchema 中。看起来标量字段的处理方式不同,但我仍然不清楚我的确切问题是什么。 尝试使该字段成为对象,看看是否可以使其工作?不幸的是,我还没有真正尝试过 graphql-tools :) 【参考方案1】:

我的问题是我不明白您传递给 makeExecutableSchema 的解析器(来自 graphql-tools)需要将您的所有类型映射到它们自己的解析器。换句话说,每个类型都应该在您传递给 makeExecutableSchema 的解析器对象中有一个***条目。

这是我解决问题的方法:

解析器

const rootResolvers = 
    review(root, args, context) 
        console.log('resolving review');
        return 'HasErrors': true
    


const reviewResolvers = 
    extraStuff(root, args, context) 
        console.log('resolving extraStuff');
        return "yes";
    


export default 
    RootQuery: rootResolvers
    Review: reviewResolvers
;

我的架构或其他任何地方都不需要更改。

【讨论】:

以上是关于GraphQL 字段的解析器没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL:未在突变子字段上调用解析器

使用 type-graphql 和 RESTDataSource 为第二个 api 调用添加字段解析器

GraphQL 解析器问题

如何使用带有 ktor 框架的 graphql-kotlin 进行字段级解析器

Java GraphQL - 将字段值传递给对象的解析器

GraphQL:从兄弟解析器访问另一个解析器/字段输出