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

BrinkDaDrink спросил: 10 мая 2018 в 04:03 в: node.js

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

Ошибка: ожидается, что неопределенный тип GraphQL.

/ blockquote>

UPDATE: Я считаю, что это связано с тем, что 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 в файле канала. Я пытаюсь получить канал со счета или всех учетных записей, связанных с каналом, но в настоящее время работает только канал со стороны учетной записи.

1 ответ

Herku ответил: 20 мая 2018 в 12:44

Я ответил на очень похожий вопрос здесь , но я думаю, что они немного разные. Я попытался объяснить систему модуля там немного, но в основном ответ заключается в том, что при работе с рекурсивными типами просто оберните свойство 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 ответил: 10 мая 2018 в 11:13
Я попробовал ваше предложение, которое раньше работало в одном файле, но не работает в этом сенарио. Это из-за необходимости?
Herku ответил: 11 мая 2018 в 09:13
Я думаю, что проблема может заключаться в деструкции требуемых модулей, поскольку она не совсем работает, как ESM. Попробуйте вместо этого использовать accountTypes.accountType.
BrinkDaDrink ответил: 14 мая 2018 в 03:49
Эй, Херку, не уверен, что вы подразумеваете, используя это вместо этого?
Herku ответил: 20 мая 2018 в 12:45
Я скорректировал ответ. Лучше всего было бы просто использовать модули EcmaScript для этого и использовать транспилятор, чтобы помочь вам в этом. Таким образом, вы не будете страдать от многих ошибок JavaScript ...

Дополнительное видео по вопросу: Связанные объекты Graphql, дающие undefined

Build a Node.js App With Sequelize [1] - Connection & Model

How to BUILD an optimized Graphql API in NODE and SQL | sequelize

Node.js + Passport.js + Sequelize.js