Graphql 组件中cache.writeQuery上缺少字段?
我在研究GraphQL变异组件。我在做一个突变,增加了一个决心,也就是新年决心。以下是模式: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
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});
[.....]