Типы Graphql, GQL и InputTypes {«сообщение»:»Переменная «$переменная» требуемого типа «типа!» не было предусмотрено».}

#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 «уровень»