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 响应映射为单一类型?