Связанные объекты Graphql, дающие undefined

Я получаю эту ошибку при запуске сервера

Error: Expected undefined to be a GraphQL type.

ОБНОВЛЕНИЕ: я считаю, что это связано с тем, что javascript требует друг друга. Как лучше всего решить эту проблему?

У меня есть тип учетной записи в файле accountTypes.js

const { channelType } = require('../channel/channelTypes');

//Define Order type
const accountType = new GraphQLObjectType({
  name: 'Account',
  description: 'An account',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLInt),
      description: 'The id of the account.'
    },
    name: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'Name of the account.'
    },
    channel: {
      type: channelType,
      resolve: resolver(db.Account.Channel),
      description: 'Channel'
    },
    etc...

И мой тип канала находится в channelTypes.js

const { accountType } = require('../account/accountTypes');

// Define Channel type
const channelType = new GraphQLObjectType({
  name: 'Channel',
  description: 'A Channel',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLInt),
      description: 'ID of the channel.'
    },
    name: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'Name of the channel',
      deprecationReason: 'We split up the name into two'
    },
    accounts: {
      type: new GraphQLList(accountType),
      description: 'accounts associated with this channel',
      resolve: resolver(db.Channel.Account)
    }
  })
});

Код с проблемой находится в моем файле channelTypes.js. accountType по какой-то причине становится неопределенным. Я использую module.exports для экспорта accountType и channelType в соответствующие файлы. Учетная запись работает отлично, когда я закомментировал код accountType в файле канала. Я пытаюсь получить канал из учетной записи или всех учетных записей, связанных с каналом, но в настоящее время работает только канал со стороны учетной записи.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
402
1

Ответы 1

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

Редактировать: Также не деструктурируйте объект модуля. Когда у вас есть циклические зависимости, циклически зависимые модули получат ссылку на модуль, но не будут инициализированы. Когда вы затем деструктурируете их, переменная получит undefined, поскольку у модуля еще нет свойств.

const accountTypes = require('../account/accountTypes');

// Define Channel type
const channelType = new GraphQLObjectType({
  name: 'Channel',
  description: 'A Channel',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLInt),
      description: 'ID of the channel.'
    },
    name: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'Name of the channel',
      deprecationReason: 'We split up the name into two'
    },
    accounts: {
      type: new GraphQLList(accountTypes.accountType),
      description: 'accounts associated with this channel',
      resolve: resolver(db.Channel.Account)
    }
  })
});

Я попробовал ваше предложение, которое раньше работало в одном файле, но не работает в этом сенарио. Это из-за необходимости?

BrinkDaDrink 04.06.2018 02:53

Я думаю, что проблема может заключаться в деструктуризации необходимых модулей, поскольку это не совсем так, как ESM. Попробуйте вместо этого использовать accountTypes.accountType.

Herku 04.06.2018 12:53

Привет, @Herku, не понимаешь, что ты имеешь в виду, используя это вместо этого?

BrinkDaDrink 08.06.2018 07:29

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

Herku 13.06.2018 16:25

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