Apollo Graphql:重命名模式以实现向后兼容性
Posted
技术标签:
【中文标题】Apollo Graphql:重命名模式以实现向后兼容性【英文标题】:Apollo Graphql: Rename schema for backward compatibility 【发布时间】:2020-06-04 20:39:56 【问题描述】:我想做什么?
在 Apollo Graphl 服务器中,我想在架构中将实体 Person
更改为 Human
,但我不想破坏我的客户端(正在查询 graphql 的前端)。因此,如果客户正在查询Person
,我想将其映射到Human
。
示例:
客户查询
query
Person
ID
firstName
重写到
query
Human
ID
name
重写回复
data:
Person:
Id: 123,
name:"abc"
我尝试过的事情
graphql-rewriter 提供了类似于我正在寻找的东西。我浏览了它的文档,但它没有重写字段名称的选项。
在 apollo graphql 文档 Apollow graphql directives 中,他们提到了重命名指令,但我没有找到 rename-directive-package
节点模块。
apollo-directives-package我也试过这个,但它没有重命名缩放字段的选项,例如
import makeExecutableSchema from "graphql-tools";
import RenameDirective from "rename-directive-package";
const typeDefs = `
type Person @rename(to: "Human")
name: String!
currentDateMinusDateOfBirth: Int @rename(to: "age")
`;
const schema = makeExecutableSchema(
typeDefs,
schemaDirectives:
rename: RenameDirective
);
任何建议/帮助将不胜感激。
【问题讨论】:
【参考方案1】:在这里我希望这对你有所帮助,首先我们必须创建模式指令
import SchemaDirectiveVisitor from "graphql-tools";
import GraphQLObjectType, defaultFieldResolver from "graphql";
/**
*
*/
export class RenameSchemaDirective extends SchemaDirectiveVisitor
/**
*
* @param GraphQLObjectType obj
*/
visitObject(obj)
const resolve = defaultFieldResolver = obj;
obj.name = this.args.to;
console.log(obj);
type-defs.js
directive @rename(to: String!) on OBJ
type AuthorizedUser @rename(to: "Human1")
id: ID!
token: ID!
fullName: String!
roles: [Role!]!
【讨论】:
以上是关于Apollo Graphql:重命名模式以实现向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Nuxt ServerMiddleware 和 Apollo GraphQL 处理 301 重定向
在 NestJS + GraphQL 中实现“命名空间类型”解析器
如何使用 apollo / graphql 实现节点查询解析器