GraphQL [graphql js] циклические зависимости: тип * должен быть типом вывода, но получен: [объект объекта] - PullRequest
0 голосов
/ 03 мая 2018

EDIT

добавил мое решение в качестве ответа


ОРИГИНАЛЬНЫЙ ВОПРОС

Я считаю, что эта проблема связана с круговыми зависимостями. Я провел лучшую половину прошлой ночи и сегодня пробовал все, что мог найти в Интернете, но, похоже, ничего не помогало.

что я пробовал:

  • преобразовать fields реквизит в функцию, которая возвращает объект поля
  • преобразует соответствующие поля (внутри полей prop) в функции, возвращающие тип
  • объединяя два подхода выше
  • наконец заканчивается инструкциями require вместо полей, которые используют ссылочный тип (кажется неправильным, и у линтера был штрих над этим)

вот структура файла:

File Structure

вот код:

userType.js

const graphql = require('graphql');
const Connection = require('../../db/connection');
const ConnectionType = require('../connection/connectionType');

const { GraphQLObjectType, GraphQLList, GraphQLString, GraphQLID } = graphql;

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
    id: { type: GraphQLID },
    username: { type: GraphQLString },
    email: { type: GraphQLString },
    created: {
      type: GraphQLList(ConnectionType),
      resolve: ({ id }) => Connection.find({ owner: id }),
    },
    joined: {
      type: GraphQLList(ConnectionType),
      resolve: ({ id }) => Connection.find({ partner: id }),
    },
  }),
});

module.exports = UserType;

connectionType.js

const graphql = require('graphql');
const User = require('../../db/user');
const UserType = require('../user/userType');

const { GraphQLObjectType, GraphQLString, GraphQLID, GraphQLInt } = graphql;

const ConnectionType = new GraphQLObjectType({
  name: 'Connection',
  fields: () => ({
    id: { type: GraphQLID },
    owner: {
      type: UserType,
      resolve: ({ owner }) => User.findById(owner),
    },
    partner: {
      type: UserType,
      resolve: ({ partner }) => User.findById(partner),
    },
    title: { type: GraphQLString },
    description: { type: GraphQLString },
    timestamp: { type: GraphQLString },
    lifespan: { type: GraphQLInt },
  }),
});

module.exports = ConnectionType;

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

У меня была похожая проблема с использованием Typescript, и мне больше нравится определение типа на основе javascript, поэтому оно не изменилось на GraphQL SDL.

Я заставил его работать, просто указав тип const в GraphQLObjectType.

Что-то вроде:

export const UserType: GraphQLObjectType = new GraphQLObjectType({
  name: 'UserType',
  fields: () => ({
    .....
  })
}

Теперь работает без проблем.

0 голосов
/ 04 мая 2018

Я не мог получить какую-либо помощь по этому вопросу в любом месте. на случай, если кто-нибудь столкнется с этим сообщением об ошибке, вот шаги, которые я предпринял, чтобы исправить это:

  1. переключено с graphql-express на apollo-server-express (в этом не было необходимости, но я обнаружил, что apollo - более надежная библиотека)
  2. использовал следующие пакеты: graphql graphql-import graphql-tools
  3. переключен с определения типа Type на основе JavaScript на использование типа файла GraphQL SDL (.graphql)
  4. шаг 3 - это то, что исправило проблему кругового импорта, связанную с отношениями один-ко-многим (и м2м)

Я совершил каждый шаг рефакторинга от выгрузки старого кода до создания нового. я добавил множество заметок и явных имен, чтобы их можно было использовать в качестве руководства.

вы можете посмотреть историю изменений по ссылкам ниже. вся работа до последних нескольких коммитов была сделана в каталоге graphql/. если вы щелкнете по названию коммита, он покажет вам разницу, чтобы вы могли следить за рефакторингом

после рефакторинга у меня теперь есть более чистые распознаватели, лучший шаблон каталогов и, что самое важное, полностью функционирующие отношения один-ко-многим между пользователем и подключением! ... только занял весь мой чертов день.

отношение в этом случае: Соединение принадлежит владельцу (пользователь через owner_id) и партнеру (пользователь через partner_id).

отсюда мы будем двигаться вперед с кодовой базой, но я заблокировал ветку и ее коммиты для тех, кто нуждается в руководстве.

...