Size: a a a

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

2021 October 06

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
В реальных проектах, конечно, возвращается (коды ошибок, какой-нибудь пейлоад и пр...).
источник

A

Anton K. in GraphQL — русскоговорящее сообщество
а как же возвращать всегда измененный / добавленный / созданный обьект причем со всеми полями с которыми он приходит по гет
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Разные бывают случаи. Если можно полагаться на пейлоад мутации - возвращают его. Если нельзя, то лучше перечитать кверей данные заново после мутации.
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
А еще лучше через вебсокет наладить сабскрипшены и обновлять квери после прихода сабскрипшена
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Ибо асинхронность и все такое
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
В современных системах с очередями, данные в "базу" записываются не сразу после того, как мутация завершилась, причем неизвестно насколько позже, может пройти время
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Так что мутацией полезно в пейлоаде просто ответить, что мол, я тебя понял, запрос принят, занимаюсь
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
А потом прислать сабскрипшен - там ты заказывал изменение? вот оно, готово
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
И на этом моменте перекверяешь
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Это лишь один из вариантов. У всех архитектуры разные
источник

A

Anton K. in GraphQL — русскоговорящее сообщество
да
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
А про разницу в использовании... Ну первое что пришло в голову - в Apollo, например, для кверей можно настроить рефреш через сколько миллисекунд запрос повторять (pollInterval), а для мутаций такого нет, ее надо всегда явно вызывать. И пр... Можно при желании найти тонкую разницу между мутацией и квери, если подумать.
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
В простейших случаях можно, конечно, дать мутации возможность прикинуться кверей или наоборот :)
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Я не сильно ковырял, но еще, скорее всего, через квери нельзя файл загрузить (upload), по крайней мере мы через мутацию это делаем
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
(хотя, возможно, это зависит от конкретной библиотеки)
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Ну и что-то мне подсказывает, что результат мутации в кэш так просто не попадет :)
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Скорее всего это главное отличие. На результатах квери библиотеки строят кэш-состояние. На результатах мутаций - нет.
источник

ПМ

Павел Мудров... in GraphQL — русскоговорящее сообщество
Сейчас посмотрим, что Черторогов ответит :)
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Посмотрите почитайте про CQRS.
C === write === mutation,
Q === read === query

Проще говоря, если операция read/query отвалилась, то ее можно смело повторить.

А вот если отвалилась мутация (вы не получили ответ), то повторение этой операции может иметь последствия. И мутацию уже тупо вслепую повторять не желательно.

Квери можно кэшировать на клиенте и даже на сервере, а вот мутации кэшировать нельзя.

Квери могут лететь на реплики/слейвы, мутации на мастер.

В итоге, если данные меняются или что-то создается, то это мутация.

login/logout это мутация - под капотом создается/убивается сессия.
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Ну и по спеке самого графкуэля, у них есть небольшая разница

В query корневые поля резолвяться параллельно.

В мутации корневые поля резолвятся последовательно. Типа если в одной операции несколько мутаций, то они будут выполняться по очереди. Но если честно, на практике никто не дергает так мутации.

В итоге, все сводиться просто к семантическому разделению операций. Разницы в кверях и мутациях больше никаких нет. Даже файлы можно через квери грузить, но это антипаттерн. Файлы лучше через старый добрый REST гонять.
источник