Size: a a a

GraphQL — русскоговорящее сообщество

2018 November 09

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Из packt.com писала Reshma Raman звала автором в "GraphQL Quick Start Guide".

Ну плюс есть выход наManning Publications. Я там технический ревьювир для курса https://www.manning.com/livevideo/graphql-in-motion (они его уже больше года пилят и еще не закончили, уже два автора сменилось 😅).
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Как закончу я в GitBook все это перенесу, чтоб удобнее навигация была. Поиск и прочая GUI радость. Не все воспринимают чтение в github'е. А на хабре писать смысла нет, сложно потом в актуальном состоянии поддерживать, да и хомячки потом в комментах гадить начинают 😡
источник

U

Uxname in GraphQL — русскоговорящее сообщество
Pavel @nodkz
Как закончу я в GitBook все это перенесу, чтоб удобнее навигация была. Поиск и прочая GUI радость. Не все воспринимают чтение в github'е. А на хабре писать смысла нет, сложно потом в актуальном состоянии поддерживать, да и хомячки потом в комментах гадить начинают 😡
+
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Вот как правильно юзать DataLoader
js
const ArticleType = new GraphQLObjectType({
 name: 'Article',
 fields: () => ({
   title: { type: GraphQLString },
   authorId: { type: GraphQLString },
   author: {
     type: AuthorType,
     // WAS
     // resolve: source => {
     //   return authorModel.findById(source.authorId);
     // },
     // BECAME:
     resolve: (source, args, context, info) => {
       // See dl-server.js, there was created context = { dataloaders: new WeakMap() };
       const { dataloaders } = context;
       // init DataLoader once, if not exists
       // we use a MAGIC here
       // `Set.get(info.fieldNodes)` is unique for every field in the query
       // it helps to determine the same resolvers
       let dl = dataloaders.get(info.fieldNodes);
       if (!dl) {
         dl = new DataLoader(async (ids: any) => {
           // regular request to our database
           const rows = await authorModel.findByIds(ids);
           // IMPORTANT: we MUST return rows in the same order like we get ids
           const sortedInIdsOrder = ids.map(id => rows.find(x => x.id === id));
           return sortedInIdsOrder;
         });
         dataloaders.set(info.fieldNodes, dl);
       }
       // load author via dataloader
       return dl.load(source.authorId);
     },
   },
 }),
});
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Вот реальный пример кода вам на погонять и посмотреть:
https://github.com/nodkz/conf-talks/blob/master/particles/graphql/data-loader/dl-server.js

Русских букав в статье позже добавлю. Много времени убил на создание простого примера.

А документашка у самого DataLoader'а лютое говнище. Понятно почему столько людей им недовольны. Там в легкую можно огородов нагородить и не в ту сторону уйти.
источник
2018 November 10

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Всем привет. Кто использует schema stitching, как вы решаете вопрос с добавлением полей, которые зависят от других полей, в существующие типы дочерних схем?
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Например у меня есть тип City с полями name_en, name_ru, это тип находится в дочерней схеме, я могу сделать extend и добавить поле name, а также добавить резолвер на это поле. Но если сам пользователь не запросит поля name_en и name_ru, я в аргументе parent моего резолвера не получу этих полей
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
как сделать так, чтобы эти поля запрашивались у дочерней схемы автоматически, вне зависимости от того, запросил их пользователь или нет?
источник

OG

Oleg Gamega in GraphQL — русскоговорящее сообщество
а разве это не противоречит принуипам  graphql?
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Каким принципам?
источник

OG

Oleg Gamega in GraphQL — русскоговорящее сообщество
что клиент должен поулчать ровно то что запрашивает
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Он будет запрашивать поле name
источник

OG

Oleg Gamega in GraphQL — русскоговорящее сообщество
тоесть если клиент не запросил это поле то оно ему и не нужно
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
и получать только его)
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
а мне нужно посмотреть, если клиент запросил поле name, то я попрошу у дочерней схемы поле name_en или name_ru, в зависимости от того, какой язык ему нужен
источник

OG

Oleg Gamega in GraphQL — русскоговорящее сообщество
если клиент как то передает данные о язоквых настройках то брать оттуда, в противном случае отдавать по дефолту
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
да это понятно
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
я не про это спрашиваю)
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Maxim Makarov
Например у меня есть тип City с полями name_en, name_ru, это тип находится в дочерней схеме, я могу сделать extend и добавить поле name, а также добавить резолвер на это поле. Но если сам пользователь не запросит поля name_en и name_ru, я в аргументе parent моего резолвера не получу этих полей
нашел ответ на свой вопрос:
In order to delegate to these root fields, we’ll need to make sure we’ve actually requested the id of the user or the authorId of the chirp. To avoid forcing users to add these fields to their queries manually, resolvers on a merged schema can define a fragment property that specifies the required fields, and they will be added to the query automatically.
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
В итоге получилось вот так:
источник