繁体   English   中英

Apollo GraphQL:扩展而不是覆盖默认解析器行为

[英]Apollo GraphQL: Augment instead of overriding default resolver behaviour

在Apollo Server文档中,它描述了默认解析器的行为,这非常方便。

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

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

我想做的是增加默认行为,而不是覆盖默认行为。 具体来说,我正在与一个REST API集成,该API将返回snake_case中的字段,而我的架构正尝试遵循使用camelCase作为字段名称的建议约定。 我想将此字段名称转换包装在默认解析器行为的周围,而不必重新编写。

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

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

const { defaultFieldResolver } = require('graphql')

但是,可以将字段从蛇格转换为驼峰格,而无需调用默认解析器:

someField: (parent) => parent.some_field

如果要创建可重用的解析器功能,可以执行以下操作:

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

或者更好的是,将逻辑提取到schema指令中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM