GraphQL: как я могу выдать предупреждение после успешной мутации?

Представим, что у меня есть мутация createPost, которая вставляет новый пост. В типичном приложении эта мутация может:

  • Успешно, вернув Post.
  • Ошибка, выдает ошибку (я использую аполлон-ошибки, чтобы справиться с этим).

Я бы хотел реализовать средний сценарий, при котором мутация проходит успешно (возвращается Post); но также каким-то образом возвращает предупреждение пользователю (например, Your post is similar to post XYZ или подобное).

Что было бы хорошим шаблоном GraphQL для реализации этого? Добавление поля warning к типу Post кажется немного странным, но опять же, я не уверен, как вернуть и Post, и Warning в одной и той же мутации? Любые идеи?

(Обратите внимание, что я использую этот сценарий в качестве примера, меня интересует общая схема возврата дополнительных данных после мутации, а не нахождение похожих сообщений конкретно)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
9
0
1 029
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все мои мутации возвращают тип полезной нагрузки упаковки, а не один тип значения (например, Post в вашем случае), я также никогда не добавляю GraphQL, если это не настоящая системная ошибка - если это следствие ввода пользователя или иное ожидаемый случай, я моделирую его в возвращаемом типе.

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

Помните, что мутация - это, по сути, функция, которая принимает некоторые входные данные и текущий график и возвращает новый график. Обычно ошибочно думать о REST-подобных операциях CRUD.

type CreatePostError = {
    // Whatever you want
}

type CreatePostSuccess = {
    post: Post!
    warning: String
}

union CreatePostPayload = CreatePostSuccess | CreatePostError

mutation {
    // Other mutations
    createPost(/* args /*): CreatePostPayload
}

В этом есть большой смысл, и если поспрашивать, это действительно кажется наилучшей практикой консенсуса. Спасибо!

Sacha 18.04.2018 02:45

@AndrewIngram не будет работать, пока клиент запрашивает предупреждение. Я обнаружил, что этот пост ищет способ, возможно, вернуть некоторые предупреждающие сообщения, такие как скоро устаревшие функции и т. д.

amaster 10.12.2019 17:42

Другие вопросы по теме