Javascript Apollo GraphQL:增强而不是覆盖默认解析器行为
在Apollo服务器文档中,它描述了的行为,这非常方便 我还从其他地方收集到(如果我记得的话,这是另一个SO问题),您可以通过将fieldResolver函数传递到apollo server实例的选项中,用自己的函数覆盖默认的解析器函数: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("
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)]
}
}
}