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

Javascript Apollo GraphQL:增强而不是覆盖默认解析器行为,javascript,graphql,apollo-server,Javascript,Graphql,Apollo Server,在Apollo服务器文档中,它描述了的行为,这非常方便 我还从其他地方收集到(如果我记得的话,这是另一个SO问题),您可以通过将fieldResolver函数传递到apollo server实例的选项中,用自己的函数覆盖默认的解析器函数: const server = new ApolloServer({ typeDefs, resolvers, fieldResolver: function (source, args, context, info) { console.log("

在Apollo服务器文档中,它描述了的行为,这非常方便

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

const server = new ApolloServer({ typeDefs, resolvers,
  fieldResolver: function (source, args, context, info) {
    console.log("Field resolver triggered!")
    return null;
  }
});
我想做的是增强默认行为,而不是覆盖它。具体地说,我正在与一个RESTAPI集成,该API以snake_的形式返回字段,而我的模式正试图遵循建议的约定,即使用camelCase作为字段名。我想围绕默认解析器行为来包装这个字段名转换,而不必重新编写它


或者,如果有人能给我指出默认解析器实现的源位置,我也会很乐意接受并调整它

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

const { defaultFieldResolver } = require('graphql')
但是,可以在不调用默认解析程序的情况下将字段从snake case转换为camel case:

someField: (parent) => parent.some_field
如果要创建可重用的解析器函数,可以执行以下操作:

const camelCaseResolver = (parent, args, ctx, info) => {
  return parent[_.snakeCase(info.fieldName)]
}
或者更好的是,将逻辑提取到:


比我希望的要多。谢谢你!嗨@Daniel,玩过这个之后,我现在想知道上面的指令是否可以全局应用,而不必将
@snakeCase
添加到我(扩展)模式中的每个字段。您可以添加什么智慧吗?我的首选是使用一个函数包装对RESTAPI的调用,该函数将遍历响应并修改所有字段以符合camelCase。这就是我最近在处理同一问题的项目中所做的。除此之外,在我的脑海中。。。您可以对
defaultFieldResolver
进行修补,或者生成模式,然后遍历所有类型并修改使用默认解析器的任何字段的解析器。谢谢,这是一个很好的选项数组。我认为您自己在RESTDataSource实现中转换字段的方法可能也是满足我需求的最佳方法。
class SnakeCaseDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    field.resolve = async function (parent, args, ctx, info) {
      return parent[_.snakeCase(info.fieldName)]
    }
  }
}