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





Я ответил на очень похожий вопрос здесь, но я думаю, что они немного другие. Я попытался немного объяснить здесь модульную систему, но в основном ответ заключается в том, что при работе с рекурсивными типами просто оберните свойство 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)
}
})
});
Я думаю, что проблема может заключаться в деструктуризации необходимых модулей, поскольку это не совсем так, как ESM. Попробуйте вместо этого использовать accountTypes.accountType.
Привет, @Herku, не понимаешь, что ты имеешь в виду, используя это вместо этого?
Я скорректировал ответ. Лучше всего было бы просто использовать для этого модули EcmaScript и использовать транспилятор, который поможет вам с этим. Таким образом, вы не будете страдать от множества ошибок JavaScript ...
Я попробовал ваше предложение, которое раньше работало в одном файле, но не работает в этом сенарио. Это из-за необходимости?