首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >突变分量中的cache.writeQuery缺失域?

突变分量中的cache.writeQuery缺失域?
EN

Stack Overflow用户
提问于 2018-04-12 05:53:51
回答 1查看 2.3K关注 0票数 1

我在研究GraphQL突变成分。我正在做一个突变,增加一个分辨率,也就是新年的决心。下面是模式:

代码语言:javascript
复制
type Resolution {
  _id: String!
  name: String!
  goals: [Goal]
  completed: Boolean
}

type Query {
  resolutions: [Resolution]
}

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

以下是决议解析器:

代码语言:javascript
复制
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");
        }
    },
};

下面是用户解析器:

代码语言:javascript
复制
export default {
  Query: {
    user(obj, args, { user }) {
      return user || {};
    }
  },
  User: {
    email: user => user.emails[0].address
  }
};

以下是突变成分:

代码语言:javascript
复制
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>
    );
};

下面是在应用程序启动时加载所有分辨率的查询:

代码语言:javascript
复制
const GET_RESOLUTIONS = gql`
  query Resolutions {
    resolutions {
      _id
      name
      completed
      goals {
        _id
        name
        completed
      }
    }
    user {
      _id
    }
  }
`;

这很好,但是当我运行变异时:

代码语言:javascript
复制
const CREATE_RESOLUTION = gql`
    mutation createResolution($name: String!) {
      createResolution(name: $name) {
        __typename
        _id
        name
        goals {
          _id
          name
          completed
        }
        completed
      }
    }
`;

...I得到一个控制台日志错误,上面写着:

代码语言:javascript
复制
Missing field user in {
  "resolutions": [
    {
      "_id": "GKTNgbuiDgiZ4wAFZ",
      "name": "testing 123",
      .....

我如何使字段user进入我的突变反应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-14 04:23:24

使用的GET_RESOLUTIONS查询最初来自父组件App.js。它确实包含两个独立的查询--一个用于分辨率,另一个用于用户。CREATE_RESOLUTION变异查询和解析器不返回用户数据,我还不知道如何让它们这样做。

但是,突变组件不需要用户数据。只有在调用cache.writeQuery时,它才会感到不安,因为GET_RESOLUTIONS在请求user,而突变解析器没有返回user

因此,修复方法似乎是有一个特殊的GET_RESOLUTIONS_FOR_MUTATION_COMPONENT查询,它一开始就不需要user

代码语言:javascript
复制
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的错误消息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49788949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档