Apollo GraphQL:增强而不是覆盖默认解析器行为
Apollo GraphQL: Augment instead of overriding default resolver behaviour
在 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 中 returns 字段的 REST API 集成,而我的架构试图遵循建议的约定,即对字段名称使用驼峰命名法。我想围绕默认解析器行为包装此字段名称转换,而不必重新编写它。
或者,如果有人可以将我指向默认解析器实现的源位置,我会很乐意接受并调整它!
默认解析器可通过 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)]
}
}
}
在 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 中 returns 字段的 REST API 集成,而我的架构试图遵循建议的约定,即对字段名称使用驼峰命名法。我想围绕默认解析器行为包装此字段名称转换,而不必重新编写它。
或者,如果有人可以将我指向默认解析器实现的源位置,我会很乐意接受并调整它!
默认解析器可通过 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)]
}
}
}