GraphQL: загрузка ложна, но данные "не определены" - [решено] - PullRequest
1 голос
/ 19 апреля 2020

Я просто выкладываю это здесь для дальнейшего использования. Я взял несколько месяцев от GraphQL. Когда я вернулся, я кодировал новый распознаватель, и он возвращался с loading === false, но data === 'undefined'. Решение выявило тонкую деталь в настройке типов и запросов GraphQL, с которыми, вероятно, борется любое количество людей, только изучающих GraphQL.

В поисках ответа я искал много SO-сообщений и других статей, касающихся loading === false, но data === 'undefined', но не увидел ни одного, описывающего информацию, которую я в моем случае нужно было ее решить.

Вот настройка, которая не работает:

SCHEMA

type BraintreeClientToken{
    clientToken: String
}

type query{
  getBraintreeClientToken(localUserId: String!): BraintreeClientToken
}

QUERY LIBRARY

Это код с ошибкой

const GETBRAINTREECLIENTTOKEN_QUERY = gql`
    query ($localUserId: String!)  {
        getBraintreeClientToken(localUserId: $localUserId) {
            BraintreeClientToken
        }
    }
`;

RESOLVERS

   getBraintreeClientToken: (parent, args, context) => {
        const userid = context.userId;

        let BraintreeClientToken = {
            clientToken: '',
        }

        return Promise.resolve()
            .then(() => {
                //CODE HERE THAT CORRECTLY OBTAINS THE CLIENTTOKEN FROM THE BRAINTREE API -- NOT RELEVANT TO THIS POST
                return clientToken;
            })
            .then((clientToken) => {
                BraintreeClientToken.__typename = 'BraintreeClientToken';
                BraintreeClientToken.clientToken = clientToken.clientToken;
                return BraintreeClientToken;
            })
            .then((BraintreeClientToken) => {
                return BraintreeClientToken;
            })
            .catch((err) => {
                console.log(err);
            });
    }

Посмотрите на код библиотеки запросов. Сначала это выглядело разумно. В конце концов, преобразователь с именем getBraintreeClientToken возвращает объект с именем BraintreeClientToken, и у него есть имя типа BraintreeClientToken. Разве это не должно быть в строке запроса gql?

[см. Ответ ниже]

1 Ответ

0 голосов
/ 19 апреля 2020

Ну, это тонкая часть. Нет. Строка gql не может быть такой. Это должно быть:

БИБЛИОТЕКА ЗАПРОСОВ

Это правильный код

   const GETBRAINTREECLIENTTOKEN_QUERY = gql`
    query ($localUserId: String!)  {
        getBraintreeClientToken(localUserId: $localUserId) {
            clientToken
        }
    }
`;

Запрос gql Строка не упоминает возвращаемый тип и содержит только имена возвращаемых полей.

Все это совершенно разумно, но не является сверхинтуитивным и, похоже, не документировано. или очень много объяснил. Я публикую это здесь для любых других, которые могут искать эту информацию - и для себя тоже, если мне нужно будет искать это в будущем.

ПОЧЕМУ ЭТО ТАК

На самом деле есть веская причина, почему React такой. Реагировать основополагающе. Одним из главных преимуществ React является то, что у вас может быть одна конечная точка, способная предоставить вам все возможные фрагменты данных, с которыми он имеет какое-либо отношение, - но клиент может использовать запрос, чтобы получить именно те данные, которые ему необходимы, разработав Query так, чтобы он указывал эти данные. Это экономит полосу пропускания, а также, что очень важно, избавляет разработчиков бэкэнда от необходимости создавать миллион различных конечных точек, которые доставляют различные наборы данных обратно клиенту. :)

...