Apollo Graphql: переименование схемы для обратной совместимости - PullRequest
1 голос
/ 20 февраля 2020

Что я хочу сделать?

На сервере 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 , Они упоминали о директиве переименования, но я не нашел 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 Ответ

0 голосов
/ 20 февраля 2020

Здесь, я надеюсь, это поможет вам, сначала мы должны создать директиву схемы

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!]!
  }

...