2016-07-29 6 views
1

У меня есть проблема с GraphQL (в частности, реализуя GraphQLList)GraphQL: Как реализовать GraphQLList из GraphQLObjectTypes

У меня есть запрос getItemByName, который правильно возвращает Item, с типом itemType. Но я не смог реализовать getItemList (или соответствующий пример кстати). Я знаю, что он должен иметь тип, который реализует GraphQLList.

Но я делаю это правильно? Каков формат данных, который должен получить resolve? (Или что getItems() должен вернуться). Массив объектов? Должны ли эти объекты выполнять определение «itemType»? Должен ли интерфейс реализовываться?

export const itemType = new GraphQLObjectType({ 
    name: 'Item', 
    fields: { 
    name: { 
     type: GraphQLString, 
     description: 'Item Name', 
    }, 
    }, 
}); 

const itemListType = new GraphQLObjectType({ 
    name: 'ItemsList', 
    fields: { 
    items: { 
     type: new GraphQLList(itemType), 
     description: 'List of items', 
    }, 
    }, 
}); 

{...} 

const schema = new GraphQLSchema({ 
    query: new GraphQLObjectType({ 
     name: 'Query', 
     fields: { 
      itemList: { 
       type: itemListType, 
       resolve:() => getItems(), 
      } 
     } 
    }) 
}) 

Как теперь, запрос:

itemList { 
    items { 
    name 
    } 
} 

его возвращения:

{ 
    "data": { 
    "itemList": { 
     "items": null 
    } 
    } 
} 

Любая помощь действительно очень приветствуется! : D

С уважением!

ответ

1

Я сначала объяснить причину вашей проблемы. Затем я обсужу, как обычно используется GraphQLList.

В вашем запросе схемы itemList поле имеет тип itemListType. Теперь это itemListType имеет поле items. Поэтому поле запроса itemList должно быть разрешено к объекту с полем items. Но функция getItems() возвращает массив или обещанный массив и не имеет поля items. Вот почему вы получаете "items": null в ответе на запрос.

Теперь о путанице вокруг GraphQLList: если это всего лишь список, на самом деле нет необходимости определять для него отдельный тип GraphQL. В вашем запросе, включает в себя поле с типом GraphQLList типа элемента:

const schema = new GraphQLSchema({ 
    query: new GraphQLObjectType({ 
     name: 'Query', 
     fields: { 
      itemList: { 
       type: new GraphQLList(itemType), 
       resolve:() => getItems(), 
      } 
     } 
    }) 
}); 

Если список не так просто, к примеру, itemList на самом деле имеет два поля (oldItems, newItems - оба список), вы должны определите отдельный тип.Не забудьте изменить функцию решимости соответственно:.

itemList: { 
    type: itemListType, 
    resolve:() => { 
    // get new items 
    // get old items 
    return { 
     newItems, 
     oldItems 
    }; 
    }, 
}, 

(Кстати, ваш код имеют некоторые синтаксические ошибки, как itemsList, ITEMLIST, itemsListType, itemListType я редактировал свой вопрос изменения появятся после моего редактирования утверждено. .)

1

getItems() должен возвращать массив объектов ItemType (или обещание для одного). То, как выглядят эти элементы, зависит от вас. Они просто будут переданы в функцию resolve полей, которые вы указали в itemType.

+0

Это на самом деле обещание. Но когда вы говорите массив itemType. Мне нужно каким-то образом их преобразовать? или просто с массивом объектов, который имеет свойство 'name', то есть' '' [{name: 'asd'}] '' ' – Forres

+1

Объекты в массиве могут быть любыми, что вы хотите, поэтому' {name: 'asd' } 'отлично. – helfer

0

Исправлена ​​ошибка. Это не проблема со структурой данных, которые я возвращал, именно так я определял запрос.

export const coworkList = { 
    name: 'coworkList', 
    description: 'Returns a list (up until 10) of coworks', 
    type: new GraphQLList(coworkType), 
    resolve:() => getCoworks(), 
}; 

coworkList определение запроса является то, что в настоящее время передается в схему. Отлично работает! Const схема = новый GraphQL

Schema({ 
    query: new GraphQLObjectType({ 
    name: 'Query', 
    fields:() => ({ 
     coworkList, 
     coworkByName, 
     coworkById, 
    }), 
    }), 
});