В контексте этого примера, login
должен быть Запросом, а не Мутацией, потому что его преобразователь не имеет побочных эффектов, по крайней мере, в соответствии со спецификацией. Тем не менее, есть несколько причин, по которым вы, вероятно, не увидите, что сделано в дикой природе:
Если вы внедряете аутентификацию, вы, вероятно, захотите регистрировать активность учетной записи своих пользователей, либо сохраняя некоторые данные о событиях входа / выхода из системы, либо, по крайней мере, добавляя какое-либо поле «последний вход в систему» в запись аккаунта. Изменение этих данных будет побочным эффектом.
Разработано соглашение, которое рассматривает любые операции, возникающие в результате действий пользователя, как мутации, независимо от побочных эффектов. Это видно, например, в react-apollo
, где компоненты Query запускают связанный запрос при монтировании, в то время как компоненты Mutation просто предоставляют функцию, которая может быть вызвана для запуска этого запроса. Если вы планируете использовать клиентскую часть Apollo, при разработке схемы стоит учитывать такие возможности клиента.
Мутации запускаются последовательно, а запросы выполняются одновременно. Это означает, что было бы предсказуемо запустить мутацию входа в систему и одну или несколько других мутаций после него в рамках одного и того же вызова, что позволит вам использовать аутентифицированный контекст для последующих вызовов. То же самое нельзя сказать о запросах - если login
является запросом, и вы включаете в него другие запросы в одной и той же операции, они все начнут разрешаться одновременно.
Помимо того, как они выполняются (последовательно и одновременно), на стороне сервера запросы и мутации эффективно взаимозаменяемы. У вас могут быть запросы с побочными эффектами и мутациями без побочных эффектов. Вы, вероятно, должны придерживаться соглашений, но я думаю, что иногда есть веские причины, по которым вам, возможно, придется выбросить эти соглашения в окно.