#javascript #reactjs #graphql #gql
Вопрос:
Я не могу успешно отправить правильные типы входных данных на мой сервер GraphQL с помощью gql.
Мои typeDefs на стороне сервера:
export const typeDefs = gql`
input AuthorizeInput {
username: String!
password: String!
}
type AuthorizationPayload {
user: User!
accessToken: String!
expiresAt: DateTime!
}
extend type Mutation {
"""
Generates a new access token, if provided credentials (username and password) match any registered user.
"""
authorize(credentials: AuthorizeInput): AuthorizationPayload
}
`;
Моя мутация на стороне сервера:
export const resolvers = {
Mutation: {
authorize: async (obj, args, { authService }) => {
console.log('args', args);
const {
credentials: { username, password },
} = await argsSchema.validate(args, {
stripUnknown: true,
});
const user = await User.query().findOne({ username });
if (!user) {
throw new UserInputError('Invalid username or password');
}
const match = await bcrypt.compare(password, user.password);
if (!match) {
throw new UserInputError('Invalid username or password');
}
return {
user,
...authService.createAccessToken(user.id),
};
},
},
};
Проверка моей схемы с помощью yup на стороне сервера:
const argsSchema = yup.object().shape({
credentials: yup.object().shape({
username: yup.string().required().lowercase().trim(),
password: yup.string().required().trim(),
}),
});
Моя мутация gql с лицевой стороны:
export const AUTHORIZE = gql`
mutation authorize($credentials: AuthorizeInput!) {
authorize(credentials: $credentials ) {
accessToken
}
}
`;
Мой крючок для выполнения мутации с лицевой стороны:
const useSignIn = () => {
const [mutate, result] = useMutation(AUTHORIZE);
const signIn = async ({ username, password }) => {
mutate({ credentials: { username, password } });
};
return [signIn, result];
};
Когда я вошел в систему с обратной стороны полученных аргументов, я получил:
args {
credentials: [Object: null prototype] { username: 'kalle', password: 'password' }
}
Но проверка схемы не в порядке, и возврат:
{"message":"Variable "$username" of required type "String!" was not
provided."
{"message":"Variable "$password" of required type "String!" was not
provided."
Но в graphql playground, когда я запустил эту мутацию, она работает:
mutation {
authorize(credentials: { username: "kalle", password: "password" }) {
accessToken
}
}
Комментарии:
1. apollographql.com/docs/react/api/react/hooks/#usemutation — отсутствует
variables
«уровень»