Сохранение значения идентификатора из API для пользователя с помощью GraphQL

Я работаю над веб-сайтом видеоигр, где пользователь может сохранить игру в список. Как это должно работать, когда пользователь нажимает «Завершить игру», идентификатор игры сохраняется в состоянии, которое содержит значение. Затем значение передается в мутацию, затем мутация запускается, сохраняя идентификатор игры в пользовательском списке завершенных игр. Однако все, что я вижу в консоли, это:

"GraphQLError: Variable \"$addGame\" got invalid value { gameId: 740, name: \"Halo: Combat Evolved\",

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

Мне удалось успешно добавить игру в список в проводнике со следующей мутацией:

    mutation completeGame($addGame: AddNewGame!) {
        completeGame(addGame: $addGame) {
            _id
            completedGameCount
            completedGames {
                gameId
            }
        }
    }

со следующей переменной:

{
  "addGame": {"gameId": 740}
}

Как я могу обрезать то, что передается в мутацию, чтобы это был просто gameId?

Ниже приведена вся страница, кроме оператора return внизу.

    const [selectedGame, setSelectedGame] = useState([]);

    const [savedGameIds, setSavedGameIds] = useState(getSavedGameIds());

    const [completeGame, { error }] = useMutation(COMPLETE_GAME);

    const { id: gameId } = useParams();

    useEffect(() => {
        return () => saveGameIds(savedGameIds);
    });

    useEffect(() => {

        async function getGameId(gameId) {

            const response = await getSpecificGame(gameId);

            if (!response.ok) {
                throw new Error('Something went wrong...');
            }

            const result = await response.json();

            const gameData = result.map((game) => ({

                gameId: game.id,
                name: game.name,
                cover: game.cover,
                summary: game.summary,
                platforms: game.platforms,
                platformId: game.platforms,
                genres: game.genres,
                genreId: game.genres,
                
            }));

            setSelectedGame(gameData);

        }

        getGameId(gameId);

    }, [])

    const handleCompleteGame = async (gameId) => {
        
        const gameToComplete = selectedGame.find((game) => game.gameId === gameId);

        const token = Auth.loggedIn() ? Auth.getToken() : null;

        if (!token) {
            return false;
        }

        try {
            const { data } = await completeGame({
                variables: { addGame: { ...gameToComplete } },
            });

            console.info(data);

            setSavedGameIds([...savedGameIds, gameToComplete]);
        } catch (err) {
            console.error(err);
        }

    };

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

Тем не менее, я был бы рад прикрепить любой дополнительный код (преобразователь, typeDef, функция getSavedGameIds и т. д.), если это позволит кому-либо помочь. Проблема (я думаю) заключается в том, чтобы мой ответ соответствовал синтаксису, который я использовал в проводнике, что означает обрезание всего, кроме gameId.

Я особенно крайне подозрительно отношусь к этой строке

const gameToComplete = selectedGame.find((game) => game.gameId === gameId)

но я возился с этим какое-то время безрезультатно.

Спасибо всем, кто может помочь!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
12
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Похоже, вы пытаетесь передать в свою мутацию больше, чем разрешено вашей схемой. В этой части:

const { data } = await completeGame({
  variables: { addGame: { ...gameToComplete } },
});

Вы распространяете gameToComplete здесь, что означает, что все в объекте gameToComplete будет отправлено как переменная. Если ваша схема настроена на ожидание передачи gameId, но ваше сообщение об ошибке показывает, что name также передается, вам просто нужно настроить свои переменные, чтобы исключить все, что вы не можете принять. Пытаться:

const { data } = await completeGame({
  variables: { addGame: { gameId } },
});

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