Size: a a a

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

2018 September 29

AK

Alexander Knyazev in GraphQL — русскоговорящее сообщество
Хотя там конечно во вложенных типах тоже нужно input-типы для приведенного выше кода указать, уже довольно сильно отличаются конечно
источник

MG

Musлим Guseinov in GraphQL — русскоговорящее сообщество
Проблема с подгрузкой файла на сервер.  На клиенте использую apollo-upload-client, на сервере graphql-yoga.
Параметр в мутации типа Upload содержит в итоге только uri, type, name, так же я ожидаю stream и filename которые собственно не приходят. Кто встречался с подобной проблемой, не подскажете почему данных параметров не имеется ?
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Попробуй все-таки apollo-server взять второй версии (это полная копия йоги). Так сказать все от одного производителя, чтоб было.
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Alexander Knyazev
Всем привет. Делаю свой первый graphql server., идея нравится, да вот только не понимаю, как можно избежать лютого копипаста полей. Вот пример:
type Car {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

input CreateCarInput {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

input UpdateCarInput {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

Ну ведь одно и тоже три раза пишу. Можно ли как-то этого избежать?
Про инпут-тип, почему его завели https://github.com/nodkz/conf_talks/tree/master/particles/graphql/types#input-types

Ну и плюс (тоже надо добавить в доку) там по коду реализации есть важный ньанс:
- все аутпут типы для своих скалярных полей вызывают метод serialize
- а вот все инпут объекты - parseValue.

И тупа важна скорость при выполнении операции в рантайме. Даже ценой дубляжа типов.
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Alexander Knyazev
Искал что-то вроде fragments, но подходящего для данного случая, но ничего нет. И во всех примерах в доке, в статьях, все типы состоят из  двух-трех полей и проблема копипаста остро не стоит. А у меня в некоторых типах по 30 полей, и как-то не охота при изменениях потом в нескольких местах менять.
Тогда тебе надо схему генерировать, чтоб не мучиться с копипастой (смотри с 34 минуты) - https://youtu.be/F4vHSHzpO1g?t=34m13s

Ровно из-за твоей проблемы я два года назад начал писать graphql-compose. В нем есть вот такой метод https://graphql-compose.github.io/docs/en/api-misc.html#toinputobjecttype для генерации инпут типа из аутпут типа.

Ну а если типы сразу делаешь через композ, то такой метод
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Pavel @nodkz
Тогда тебе надо схему генерировать, чтоб не мучиться с копипастой (смотри с 34 минуты) - https://youtu.be/F4vHSHzpO1g?t=34m13s

Ровно из-за твоей проблемы я два года назад начал писать graphql-compose. В нем есть вот такой метод https://graphql-compose.github.io/docs/en/api-misc.html#toinputobjecttype для генерации инпут типа из аутпут типа.

Ну а если типы сразу делаешь через композ, то такой метод
источник

AK

Alexander Knyazev in GraphQL — русскоговорящее сообщество
Посмотрю, спасибо
источник

MG

Musлим Guseinov in GraphQL — русскоговорящее сообщество
Pavel @nodkz
Попробуй все-таки apollo-server взять второй версии (это полная копия йоги). Так сказать все от одного производителя, чтоб было.
Спасибо, попробую
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
Pavel @nodkz
Про инпут-тип, почему его завели https://github.com/nodkz/conf_talks/tree/master/particles/graphql/types#input-types

Ну и плюс (тоже надо добавить в доку) там по коду реализации есть важный ньанс:
- все аутпут типы для своих скалярных полей вызывают метод serialize
- а вот все инпут объекты - parseValue.

И тупа важна скорость при выполнении операции в рантайме. Даже ценой дубляжа типов.
👍
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
Alexander Knyazev
Всем привет. Делаю свой первый graphql server., идея нравится, да вот только не понимаю, как можно избежать лютого копипаста полей. Вот пример:
type Car {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

input CreateCarInput {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

input UpdateCarInput {
 id: ID! @unique
 type: String!
 name: String
 translatedNames: [TranslatedName]
 image: Image
 birthplace: Birthplace
 productionText: String
 marketText: String
}

Ну ведь одно и тоже три раза пишу. Можно ли как-то этого избежать?
а разве при создании автомобиля у тебя ID приходит с клиента? или почему ID обязательное поле?
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
разделение инпут типов и просто типов я думаю сделано ещё и потому, что часто эти модели не совпадают по структуре
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
например какое-нибудь поле created/updated добавляется только на сервере после создания сущности
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
возвращаясь к разделению моделей для создания/обновления сущности: при обновлении сущности ID обычно не требуется с клиента, а при обновлении ID обязателен, и использование одной модели для двух операций приводит к нарушению SRP
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
а кто-то встречал какие-нибудь статьи или советы по организации графа доступных сущностей?
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
например, меня интересует вопрос: допустим есть сущность User, у которой есть массив Orders
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
user {
 orders {
   id,
   name
 }
}
источник

a

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

a

akaSybe in GraphQL — русскоговорящее сообщество
стоит сделать что-то типа getUserOrders(userID: ID!) квери вместо nested-поля orders?
источник

a

akaSybe in GraphQL — русскоговорящее сообщество
я к тому, что если допустим резолвер юзера обращается к базе, а резолвер заказов обращается к какому-то микросервису, то при запросе заказов происходит лишний запрос к базе
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Твой вариант orders(filter: { userId: x}) { ... } организуй нормальную фильтрацию, вместо непонятных составных названий ;)
источник