【问题标题】:Apollo GraphQL: Augment instead of overriding default resolver behaviourApollo GraphQL:增强而不是覆盖默认解析器行为
【发布时间】: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 作为字段名称的建议约定。我想围绕默认解析器行为包装这个字段名称转换,而不是重新编写它。

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

【问题讨论】:

    标签: javascript graphql apollo-server


    【解决方案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 实现中转换字段的方法可能也是满足我需求的最佳方法。
    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2013-03-10
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多