2

с помощью graphql-JS, мне нужно создать схему graphql динамически итерацию массива некоторых данных, например:Динамического создания graphql схемы с циклическими ссылками

[{ 
    name: 'author', 
    fields: [{ 
     field: 'name' 
    }, { 
     field: 'books', 
     reference: 'book' 
    }] 
}, { 
    name: 'book', 
    fields: [{ 
     field: 'title' 
    }, { 
     field: 'author', 
     reference: 'author' 
    }] 
}] 

Проблема заключается в циклических ссылках. Когда я создаю AuthorType, мне нужно, чтобы BookType уже был создан и наоборот.

Так в результате схема должна выглядеть следующим образом:

type Author : Object { 
    id: ID! 
    name: String, 
    books: [Book] 
} 

type Book : Object { 
    id: ID! 
    title: String 
    author: Author 
} 

Как я могу решить эту проблему?

+1

Существует много страниц, посвященных этой проблеме. Искали какие-нибудь? Вот [пример] (https://gist.github.com/xicombd/77406c29ddf37fe46c3c). –

+0

Используйте полеconfigmapthunk http://graphql.org/docs/api-reference-type-system/ – vbranden

ответ

5

Цитируется по официальной документации

http://graphql.org/docs/api-reference-type-system/

Когда два типа должны относиться друг к другу, или тип должен относиться к себе в поле, вы можете использовать выражение функции (ака закрытие или удар) для ленивого снабжения полей.

var AddressType = new GraphQLObjectType({ 
    name: 'Address', 
    fields: { 
    street: { type: GraphQLString }, 
    number: { type: GraphQLInt }, 
    formatted: { 
     type: GraphQLString, 
     resolve(obj) { 
     return obj.number + ' ' + obj.street 
     } 
    } 
    } 
}); 

var PersonType = new GraphQLObjectType({ 
    name: 'Person', 
    fields:() => ({ 
    name: { type: GraphQLString }, 
    bestFriend: { type: PersonType }, 
    }) 
}); 

Также обратите внимание на этой связанную answer циркулярных Категории-Подкатегории типов

+0

Этот ответ почти прав, это правда, что вам нужно использовать выражение функции. Кроме того, вам нужно дважды перебирать данные. На первой итерации вы создаете все типы, но функция полей возвращает ссылки на пустые объекты. И во второй строке вам нужно заполнить эти пустые объекты фактическими данными –

0

Я решил эту проблему, используя для преобразователя, поля полех.

const User = new GraphQLObjectType({ 
    name: 'User', 
    fields:() => ({ 
    id: { type: GraphQLID } 
    }) 
}); 

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

Пожалуйста, смотрите эту должность для получения дополнительной информации Is there a way to avoid circular type dependencies in GraqhQL?

Основываясь на этом посту, я думаю, что это правильный способ сделать это.