Я работаю над веб-сайтом видеоигр, где пользователь может сохранить игру в список. Как это должно работать, когда пользователь нажимает «Завершить игру», идентификатор игры сохраняется в состоянии, которое содержит значение. Затем значение передается в мутацию, затем мутация запускается, сохраняя идентификатор игры в пользовательском списке завершенных игр. Однако все, что я вижу в консоли, это:
"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)
но я возился с этим какое-то время безрезультатно.
Спасибо всем, кто может помочь!





Похоже, вы пытаетесь передать в свою мутацию больше, чем разрешено вашей схемой. В этой части:
const { data } = await completeGame({
variables: { addGame: { ...gameToComplete } },
});
Вы распространяете gameToComplete здесь, что означает, что все в объекте gameToComplete будет отправлено как переменная. Если ваша схема настроена на ожидание передачи gameId, но ваше сообщение об ошибке показывает, что name также передается, вам просто нужно настроить свои переменные, чтобы исключить все, что вы не можете принять. Пытаться:
const { data } = await completeGame({
variables: { addGame: { gameId } },
});