У меня есть запрос Apollo GraphQL для извлечения фильмов из моего бэкэнда, и бэкэнд условно добавляет дополнительные поля в ответ, если обнаруживает пользователя с открытым сеансом (файл cookie аутентификации).
Дело в том, что интерфейс использует один и тот же запрос независимо от того, вошел ли пользователь в систему или нет, и всегда запрашивает поле, зависящее от пользователя, указывающий, находится ли фильм в коллекции пользователей, и делает это, даже если пользователь не вошел в систему, поскольку это бэкэнд. тот, который решает.
Конечно, когда ни один пользователь не вошел в систему и интерфейс запрашивает это поле, сервер решает не отправлять его, а отправлять только общедоступные поля (название, жанр ...), и запросы завершаются ошибкой. У меня есть два решения по этому поводу, но они мне не нравятся:
Add a variable to the query with @include, указывающий, вошел ли пользователь в систему или нет, чтобы получить поле
условно.
Мне это не нравится, потому что это кажется лишним, поскольку серверная часть уже проверяет это автоматически с помощью
поиск активных сессий в контексте (cookie включен в запрос). Это решение было бы приемлемым, если бы я мог добавить переменную только в запрос внешнего интерфейса.
Make the backend always send the field, даже если ни один пользователь не вошел в систему, и в этом случае
он отправляет его пустым или ложным. Не нравится, потому что это лишний трафик, особенно учитывая
что я планирую добавить много других пользовательских полей (рейтинги и т. д.), и что я ожидаю, что многие пользователи
использовать приложение без аутентификации.
Итак, мой вопрос:
Есть ли способ запросить поле в запросе GraphQL и принять ответ, даже если он вообще не включает это поле (даже не определено), при этом требуя других полей? Как лучше всего решить эту проблему, используя всего один запрос?
Я пытаюсь сделать это с помощью одного запроса, чтобы не связывать запросы в моем интерфейсе.





Если я правильно вас понял, я думаю, вы можете создать преобразователь для полей, зависящих от пользователя.
Я точно не знаю схему, но это выглядело бы так:
type Movie {
title: String
...more fields here
userSpecificInformation: UserSpecificInformation
}
а затем вы определяете преобразователь для UserSpecificInformation.
Для получения дополнительной информации ознакомьтесь с https://graphql.org/learn/execution/