Это возможно , но обычно это не очень хорошая идея, потому что:
Это нарушает соглашение. По соглашению, мутации всегда находятся в корне.Чтобы различать выполнение одного и того же действия над разными типами, вы называете свои мутации, например, editPost
и editComment
, а не просто edit
.
Наличие мутаций в корне делаетконцептуально. Независимо от того, что вы делаете (лайк, проверка электронной почты, отправка заказа и т. д.), не требуется, чтобы GraphQL разрешал дополнительные поля перед выполнением действия.Это непохоже, когда вы на самом деле запрашиваете данные.Например, чтобы получить комментарии к сообщению, нам может потребоваться разрешить поле user
, затем поле posts
и, наконец, поле comments
для каждого сообщения.На каждом «уровне» содержимое поля зависит от значения, к которому разрешено родительское поле.Обычно это не относится к мутациям.
Под капотом мутации разрешаются последовательно .Это противоречит нормальному разрешению поля, которое происходит параллельно.Это означает, что, например, firstName
и lastName
типа User
разрешаются одновременно.Однако, если ваш тип операции mutation
, все корневые поля будут обрабатываться по одному за раз.Таким образом, в таком запросе:
mutation SomeOperationName {
createUser
editUser
deleteUser
}
Каждая мутация будет происходить по одному в том порядке, в котором они появляются в документе.Тем не менее, это работает только для корня и только тогда, когда операция имеет значение mutation
, поэтому эти три поля будут разрешаться параллельно:
mutation SomeOperationName {
user {
create
edit
delete
}
}
Если вы все еще хотите это сделать, несмотря на вышеизложенное, этоэто то, как вы делаете это при использовании makeExecutableSchema
, то есть то, что Apollo использует под капотом:
const resolvers = {
Mutation: {
post: () => ({}), // return an empty object,
},
PostMutation: {
edit: () => editPost(),
},
// Other types here
}
Ваша схема определила PostMutation
как тип объекта, поэтому GraphQL ожидает, что это поле вернет объект,Если вы опустите преобразователь для post
, он вернет ноль, что означает, что ни один из преобразователей для возвращаемого типа (PostMutation
) не будет запущен.Это также означает, что мы также можем написать:
mutation {
post
}
, который ничего не делает, но все еще является действительным запросом.Что является еще одной причиной, чтобы избежать такого рода структуры схемы.