что такое реестр типов в GraphQL? Как и зачем его создать?

Я начинаю работать с GraphQL и Relay, но столкнулся с проблемой при разделении кода на разные файлы.

У меня есть TodoType в файле:

const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLBoolean,
  GraphQLNonNull,
} = require('graphql');
const { globalIdField } = require('graphql-relay');
const { nodeInterface } = require('../node/typeRegister');

const TodoType = new GraphQLObjectType({
  name: 'Todo',
  interfaces: [nodeInterface],
  fields: {
    id: globalIdField(),
    description: {
      type: GraphQLNonNull(GraphQLString),
    },
    done: {
      type: GraphQLNonNull(GraphQLBoolean),
    },
  },
});

module.exports = TodoType;

Файл для экспорта моих nodeInterface и nodeField:

const { nodeDefinitions, fromGlobalId } = require('graphql-relay');
const Todo = require('../todo/TodoModel');
const TodoType = require('../todo/TodoType');

const { nodeField, nodeInterface } = nodeDefinitions(
  async (globalId) => {
    const { type, id } = fromGlobalId(globalId);
    if (type === 'Todo') {
      const todo = await Todo.findById(id);
      return todo;
    }
  },
  (obj) => {
    console.log(obj.constructor);
    return TodoType;
  }
);

module.exports = {
  nodeField,
  nodeInterface,
};

И мой запрос выглядит так:

const {
  GraphQLObjectType,
  GraphQLID,
  GraphQLNonNull,
  GraphQLList,
} = require('graphql');
const { nodeField } = require('../modules/node/typeRegister');
const TodoType = require('../modules/todo/TodoType');
const Todo = require('../modules/todo/TodoModel');

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    todo: {
      args: {
        id: { type: GraphQLNonNull(GraphQLID) },
      },
      type: TodoType,
      resolve: async (_, args) => {
        const { id } = fromGlobalId(args.id);
        const todo = await Todo.findById(id);
        return todo;
      },
    },
    todos: {
      type: new GraphQLNonNull(GraphQLList(TodoType)),
      resolve: async () => {
        const todos = await Todo.find();
        return todos;
      },
    },

    node: nodeField,
  },
});

module.exports = QueryType;

Что происходит, так это то, что в моем файле TodoType nodeInterface является undefined. Я искал это и обнаружил, что мне, вероятно, нужен реестр типов для решения этой проблемы, но я не мог понять, как работает реестр типов и как его создать. Как это работает? Можно ли решить эту проблему с помощью реестра типов?

0 ответов

Другие вопросы по тегам