我在节点js(没有React)上使用apollo-client来存储,获取和更新数据。像以下一样创建客户端:
const { ApolloClient } = require('apollo-client');
const { InMemoryCache } = require('apollo-cache-inmemory');
const { SchemaLink } = require('apollo-link-schema');
const gqlClient = new ApolloClient({
addTypename: false,
ssrMode: true,
cache: new InMemoryCache({
}),
link: new SchemaLink({ schema }),
});
使用graphql-tag
包进行查询:
const gql = require('graphql-tag');
mylicense = gql`
query Licenses($userId: String!){
myLicense(userId:$userId) {
license{
value
}
}
}
`;
getLicense = gql`
query Licenses($id: ID!){
license(_id:$id) {
_id,
name,
value
}
}
`,
updateLicense = gql`
mutation updateLicense($id: ID!, $name: String, $value: String){
updateLicense(_id:$id, name: $name, value: $value) {
_id,
name,
value
}
}
`,
我这样调用更新(是的,我从REST请求中获取数据,但现在不重要):
const options = {
mutation: updateLicense,
variables,
// update or refetchQueries tried here
};
return gqlClient.mutate(options)
.then(result => res.json({ data: result.data.updateLicense }))
.catch(next);
我们在这里,不知何故,我需要使用variables
值更新缓存,因为mylicense
路由不会返回新值。
gqlClient.query({ query: mylicense, { userId: 'anything' } })
我读了很多documentations,例如update
选项:
const update = (proxy, { data: { updateLicense } }) => {
const data = proxy.readQuery({
query: mylicense,
variables: { userId: req.params.id },
});
data.updateLicense.push(updateLicense);
proxy.writeQuery({ query: license.get, data, variables });
};
它在proxy.readQuery行上删除了一个错误:Can't find field mylicense({"userId":"..."}) on object (ROOT_QUERY)
另一个选项是refetchQueries
,应该更简单,至少不会丢失错误,但是没有做任何事情:
const refetchQueries = [
{ query: mylicense},
// or
'myLicense'
// or
{ query: mylicense, variables: { userId: variables.id } },
];
我尝试使用不同的设置制作客户端:
const gqlClient = new ApolloClient({
addTypename: false,
ssrMode: true,
cache: new InMemoryCache({
dataIdFromObject: ({ id }) => id || null,
addTypename: false,
}),
dataIdFromObject: ({ id }) => id || null,
link: new SchemaLink({ schema }),
});
仍然没有。
我真的想出了我的所有想法。正如我所见,graphQL主要用于React,也许我的问题是节点js具体,我不知道......
任何想法都表示赞赏!