Graphql 组件中cache.writeQuery上缺少字段?

Graphql 组件中cache.writeQuery上缺少字段?,graphql,apollo,apollo-client,apollo-server,Graphql,Apollo,Apollo Client,Apollo Server,我在研究GraphQL变异组件。我在做一个突变,增加了一个决心,也就是新年决心。以下是模式: type Resolution { _id: String! name: String! goals: [Goal] completed: Boolean } type Query { resolutions: [Resolution] } type Mutation { createResolution(name: String!): { Resolutio

我在研究GraphQL变异组件。我在做一个突变,增加了一个决心,也就是新年决心。以下是模式:

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 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
输入到我的突变响应中?

使用的get\u RESOLUTIONS查询最初来自父组件App.js。它实际上包含两个独立的查询——一个用于解析,另一个用于用户。CREATE_RESOLUTION突变查询和解析器不返回用户数据,我还不知道如何让他们这样做

但是,变异组件不需要用户数据。它只会在调用
cache.writeQuery
时出错,因为GET\u解析请求
用户
,而变异解析程序没有返回
用户

因此,解决方案似乎是为组件查询提供一个特殊的GET\u RESOLUTIONS\u,该查询首先不要求
用户

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});
[.....]

使用该选项时,不会出现询问
用户的错误消息

有可能用其他DataScalarType来覆盖它吗<代码>类型解析版本{解析:解析用户:字符串}
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});
[.....]