[英]Apollo-client (react) - Update on create mutation - “Can't find field Fund({}) on object (ROOT_QUERY)”
Using: "react-apollo": "^1.4.3" 使用:“react-apollo”:“^ 1.4.3”
In the parent component I query using GraphQL a parent node 'Fund' with children 'fundQuarterlyMetric'. 在父组件中,我使用GraphQL查询具有子项'fundQuarterlyMetric'的父节点'Fund'。 This returns data in the following format:
这将以以下格式返回数据:
{
id
name
...
fundQuarterlyMetrics (orderBy: asAtDate_ASC) {
id
year
quarter
...
}
}
When I try to create a new fundQuarterlyMetrics I have to update the local store on react-apollo using the update feature ( Apollo Client docs ). 当我尝试创建一个新的fundQuarterlyMetrics时,我必须使用更新功能( Apollo Client docs )更新react-apollo上的本地存储。 It gives me an error:
它给了我一个错误:
Can't find field Fund({}) on object (ROOT_QUERY) {
"Fund({\"id\":\"cj57hpfips0x7014414u5tk8m\"})": {
"type": "id",
"id": "Fund:cj57hpfips0x7014414u5tk8m",
"generated": false
}
The thing is, is that when I console.log the proxy, I can see the Fund and it's children under data.... not sure what to do.. 问题是,当我在console.log代理时,我可以看到基金和它的孩子们的数据....不知道该怎么做..
UPDATE following comment: 更新以下评论:
Here is the parent component data request: 这是父组件数据请求:
export const fundPageQuery = gql`
query Fund($fundId: ID!) {
Fund(id: $fundId) {
id
name
....other variables
fundQuarterlyMetrics (orderBy: asAtDate_ASC) {
id
year
quarter
....other variables
}
}
} `; };
Here are the options I used: 以下是我使用的选项:
var optionsForCreateFundMetric = {
update: (proxy, {data: {createFundMetrics}}) => {
try {
console.log('proxy', proxy);
const data = proxy.readQuery({query: FundQL.fundPageQuery});
console.log('data', data);
data.Fund.fundQuarterlyMetrics.push(createFundMetrics);
proxy.writeQuery({query: FundQL.fundPageQuery, data})
} catch (e) {
console.log('error adding to store', e);
}
} }; }};
export default compose(
graphql(FundQL.createFundMetrics, {name: 'createFundMetrics', options:
optionsForCreateFundMetric}),
graphql(FundQL.updateFundMetrics, {name: 'updateFundMetrics'})
)(FundMetricsForm);
Here is my create mutation: 这是我的创建突变:
export const createFundMetrics = gql`
mutation createFundQuarterlyMetric(
$fundId: ID
$year: Int!
$quarter: FUND_QUARTERLY_METRIC_QUARTER!
$netIRR: Float!
$tvpi: Float!
$rvpi: Float!
$dpi: Float!
$asAtDate: DateTime
$calledThisQuarter: Float!
$distributedThisQuarter: Float!
$cumulativeCalled: Float!
$cumulativeDistributed: Float!
$limitedPartnersNAV: Float!
$quarterlyValuationChangeLCY: Float
$quarterlyTotalReturn: Float
) {
createFundQuarterlyMetric(
fundId: $fundId
year: $year
quarter: $quarter
netIRR: $netIRR
tvpi: $tvpi
rvpi: $rvpi
dpi: $dpi
asAtDate: $asAtDate
calledThisQuarter: $calledThisQuarter
distributedThisQuarter: $distributedThisQuarter
cumulativeCalled: $cumulativeCalled
cumulativeDistributed: $cumulativeDistributed
limitedPartnersNAV: $limitedPartnersNAV
quarterlyValuationChangeLCY: $quarterlyValuationChangeLCY
quarterlyTotalReturn: $quarterlyTotalReturn
) {
id
year
quarter
netIRR
tvpi
rvpi
dpi
asAtDate
calledThisQuarter
distributedThisQuarter
cumulativeCalled
cumulativeDistributed
limitedPartnersNAV
quarterlyValuationChangeLCY
quarterlyTotalReturn
}
} `; };
SOLUTION Thanks Daniel - I had to return the fund ID to make it work so thank you! 解决方案谢谢丹尼尔 - 我不得不退还基金ID以使其正常运行,谢谢!
export default compose(
graphql(FundQL.createFundMetrics, {name: 'createFundMetrics', options:
optionsForCreateFundMetric, variables: {fundId:
createFundQuarterlyMetric.fund.id}}),
graphql(FundQL.updateFundMetrics, {name: 'updateFundMetrics'})
)(FundMetricsForm);
The Apollo docs do a poor job of stressing this fact, but when you call readQuery
to get a previously fetched query from the store, if that query took any variables, you need to pass in those same variables to retrieve it. Apollo文档
readQuery
强调这一事实,但是当您调用readQuery
从存储中获取先前获取的查询时,如果该查询采用任何变量,则需要传入这些相同的变量来检索它。 Assuming the id returned by mutation is the fund's id, you should be able to just modify this line: 假设变异返回的id是基金的id,你应该能够修改这一行:
const data = proxy.readQuery({
query: FundQL.fundPageQuery,
variables: { id: createFundMetrics.id },
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.