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 中实现“命名空间类型”解析器

GraphQL 对象映射 Apollo 与目标不同的模式

如何使用 apollo / graphql 实现节点查询解析器

markdown 修复NPM错误初始化Apollo GraphQL项目“未命名的项目”

(Apollo) GraphQL 合并模式