Apollo GraphQL:增强而不是覆盖默认解析器行为

Posted

技术标签:

【中文标题】Apollo GraphQL:增强而不是覆盖默认解析器行为【英文标题】:Apollo GraphQL: Augment instead of overriding default resolver behaviour 【发布时间】:2019-12-22 09:31:30 【问题描述】:

在 Apollo Server 文档中,它描述了 default resolver 的行为,非常方便。

我还从其他地方收集到(如果我记得是另一个 SO 问题),您可以通过将 fieldResolver 函数传递给 apollo-server 实例的选项来用自己的方法覆盖默认解析器函数:

const server = new ApolloServer( typeDefs, resolvers,
  fieldResolver: function (source, args, context, info) 
    console.log("Field resolver triggered!")
    return null;
  
);

我想做的是增加默认行为,而不是覆盖它。具体来说,我正在与返回snake_case 中的字段的REST API 集成,而我的模式试图遵​​循使用camelCase 作为字段名称的建议约定。我想围绕默认解析器行为包装这个字段名称转换,而不是重新编写它。

或者,如果有人可以将我指向默认解析器实现的源位置,我很乐意接受并对其进行调整!

【问题讨论】:

【参考方案1】:

默认解析器可通过graphql 模块获得:

const  defaultFieldResolver  = require('graphql')

但是,无需调用默认解析器即可将字段从蛇形大小写转换为骆驼大小写:

someField: (parent) => parent.some_field

如果你想创建一个可重用的解析器函数,你可以这样做:

const camelCaseResolver = (parent, args, ctx, info) => 
  return parent[_.snakeCase(info.fieldName)]

或者更好的是,将逻辑提取到schema directive:

class SnakeCaseDirective extends SchemaDirectiveVisitor 
  visitFieldDefinition(field) 
    field.resolve = async function (parent, args, ctx, info) 
      return parent[_.snakeCase(info.fieldName)]
    
  

【讨论】:

超出我的预期。谢谢! 嗨@Daniel,玩过这个之后,我现在想知道是否可以在全球范围内应用上述指令,而不必将@snakeCase 添加到我的(广泛)模式中的每个字段中。您可以添加任何智慧吗? 我的偏好是使用一个函数来包装对 REST API 的调用,该函数将遍历响应并将所有字段修改为 camelCase。这就是我最近在处理相同问题的项目中所做的。 除此之外,我想不到...您可以修改 defaultFieldResolver 或生成模式,然后遍历所有类型并修改使用默认值的任何字段的解析器解析器。 谢谢,那里有很多选择。我认为您自己在 RESTDataSource 实现中转换字段的方法可能也是满足我需求的最佳方法。

以上是关于Apollo GraphQL:增强而不是覆盖默认解析器行为的主要内容,如果未能解决你的问题,请参考以下文章

Apollo-server-express 返回“无法获取 /”而不是 Graphql 操场

Apollo GraphQL 客户端查询返回自省结果而不是数据

是否可以将 Apollo GraphQL 响应映射为单一类型?

如何测试graphql apollo组件?如何在 compose() 中获得完整的覆盖?

查询后如何更新 Apollo 缓存?

Apollo GraphQL 加载查询