Отсутствует поле в cache.writeQuery в компоненте мутации?

Я изучаю компоненты GraphQL Mutation. Делаю мутацию, которая добавляет разрешение, т.е. новогоднее разрешение. Вот схема:

type Resolution {
  _id: String!
  name: String!
  goals: [Goal]
  completed: Boolean
}

type Query {
  resolutions: [Resolution]
}

type Mutation {
  createResolution(name: String!): {
        Resolution
        user: String
    }
}

Вот преобразователи разрешения:

import Resolutions from "./resolutions";
import Goals from "../goals/goals";
import { PubSub } from 'graphql-subscriptions';

export const pubsub = new PubSub();

export default {
    Query: {
        resolutions(obj, args, { userId }) {
            return Resolutions.find({
                userId
            }).fetch();
        }
    },

    Resolution: {
        goals: resolution =>
            Goals.find({
                resolutionId: resolution._id
            }).fetch(),

        completed: resolution => {
            const goals = Goals.find({
                resolutionId: resolution._id
            }).fetch();
            if (goals.length === 0) return false;
            const completedGoals = goals.filter(goal => goal.completed);
            return goals.length === completedGoals.length;
        }
    },

    Mutation: {
        createResolution(obj, { name }, { userId }) {
            if (userId) {
                const resolutionId = Resolutions.insert({
                    name,
                    userId
                });
                return Resolutions.findOne(resolutionId);
            }
            throw new Error("Unauthortized");
        }
    },
};

Вот преобразователь пользователей:

export default {
  Query: {
    user(obj, args, { user }) {
      return user || {};
    }
  },
  User: {
    email: user => user.emails[0].address
  }
};

Вот компонент мутации:

const ResolutionForm = () => {
    let input;
    let state = {
        error: null
    };

    return (
        <Mutation
            mutation={CREATE_RESOLUTION}
            update={(cache, {data: {createResolution}}) => {
                const {resolutions} = cache.readQuery({query: GET_RESOLUTIONS});
                cache.writeQuery({
                    query: GET_RESOLUTIONS,
                    data: {resolutions: resolutions.concat([createResolution])}
                });
            }}
        >
            {(createResolution, {data}) => (
                <div>
                    <form
                        onSubmit={e => {
                            e.preventDefault();
                            createResolution({
                                variables: {
                                    name: input.value
                                },
                            });
                            input.value = "";
                        }}
                    >
                        <input
                            ref={node => {
                                input = node;
                            }}
                        />
                        <button type="submit">Submit</button>
                    </form>
                </div>
            )}
        </Mutation>
    );
};

Вот запрос, который загружает все разрешения при запуске приложения:

const GET_RESOLUTIONS = gql`
  query Resolutions {
    resolutions {
      _id
      name
      completed
      goals {
        _id
        name
        completed
      }
    }
    user {
      _id
    }
  }
`;

Это нормально работает, но когда я запускаю мутацию:

const CREATE_RESOLUTION = gql`
    mutation createResolution($name: String!) {
      createResolution(name: $name) {
        __typename
        _id
        name
        goals {
          _id
          name
          completed
        }
        completed
      }
    }
`;

... Я получаю сообщение об ошибке журнала консоли:

Missing field user in {
  "resolutions": [
    {
      "_id": "GKTNgbuiDgiZ4wAFZ",
      "name": "testing 123",
      .....

Как мне добавить поле user в ответ на мутацию?


person VikR    schedule 12.04.2018    source источник
comment
Возможно ли покрыть это другими DataScalarType? type ResolutionCover { resolution: Resolution user: String }   -  person tuan.tran    schedule 12.04.2018


Ответы (1)


Используемый запрос GET_RESOLUTIONS изначально исходит от родительского компонента App.js. Он действительно содержит два отдельных запроса - один для разрешения и один для пользователя. Запрос CREATE_RESOLUTION Mutation и преобразователь не возвращают пользовательские данные, и я пока не знаю, как заставить их это сделать.

Но компоненту Мутации не нужны пользовательские данные. Он расстраивается только во время вызова cache.writeQuery, потому что GET_RESOLUTIONS запрашивает user, а преобразователь мутаций не возвращает user.

Таким образом, исправление, похоже, заключается в специальном запросе GET_RESOLUTIONS_FOR_MUTATION_COMPONENT, который в первую очередь не запрашивает user:

const GET_RESOLUTIONS_FOR_MUTATION_COMPONENT = gql`
  query Resolutions {
    resolutions {
      _id
      name
      completed
      goals {
        _id
        name
        completed
      }
    }
  }
`;

[.....]
     const {resolutions} = cache.readQuery({query: GET_RESOLUTIONS_FOR_MUTATION_COMPONENT});
[.....]

Используя это, нет сообщения об ошибке, запрашивающего user.

person VikR    schedule 14.04.2018