2017-08-06 29 views
4

使用: “反应 - 阿波罗”: “^ 1.4.3”阿波罗客户端(反应) - 上创建突变更新 - “无法找到对象场基金({})(ROOT_QUERY)”

在父组件中,我使用GraphQL查询了一个父节点'Fund',其子节点'fundQuarterlyMetric'。这适用于以下格式返回数据:

{  
    id 
    name 
    ... 
    fundQuarterlyMetrics (orderBy: asAtDate_ASC) { 
    id 
    year 
    quarter 
    ... 
    } 
} 

当我尝试创建一个新的fundQuarterlyMetrics我必须更新使用更新功能(Apollo Client docs)反应阿波罗本地存储。它给我一个错误:

Can't find field Fund({}) on object (ROOT_QUERY) { 
    "Fund({\"id\":\"cj57hpfips0x7014414u5tk8m\"})": { 
    "type": "id", 
    "id": "Fund:cj57hpfips0x7014414u5tk8m", 
    "generated": false 
    } 

的事情是,是,当我CONSOLE.LOG代理,我可以看到基金和它的孩子们在数据....不知道该怎么做..

UPDATE以下注释:

这里是父组件数据请求:

export const fundPageQuery = gql` 
query Fund($fundId: ID!) { 
Fund(id: $fundId) { 
    id 
    name 
    ....other variables 
    fundQuarterlyMetrics (orderBy: asAtDate_ASC) { 
    id 
    year 
    quarter 
    ....other variables 
    } 
} 

} `;

下面是我使用的选项:

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); 

这里是我的创造突变:

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 
} 

} `;

解决方案 谢谢丹尼尔 - 我不得不返回基金ID,使其工作,所以谢谢你!

export default compose(
graphql(FundQL.createFundMetrics, {name: 'createFundMetrics', options: 
optionsForCreateFundMetric, variables: {fundId: 
createFundQuarterlyMetric.fund.id}}), 
graphql(FundQL.updateFundMetrics, {name: 'updateFundMetrics'}) 
)(FundMetricsForm); 
+0

这听起来像你通过阿波罗执行突变的方式有问题 - 你不应该如果您正在处理突变,则可能会看到有关根查询的错误。请更新您的问题以包含您的代码,特别是在您定义graphql HOC和任何相关逻辑(如您对'update'的调用)的地方。 –

+0

感谢Dan的评论。我已经将代码添加到问题 – Blackstone4

回答

6

阿波罗文档做强调这个事实方面做得很差,但是当你调用readQuery从商店得到一个先前所获取的查询,如果查询了所有的变量,你需要在这些相同的变量传递给检索它。假设由突变返回的id是基金的ID,你应该可以修改这条线:

const data = proxy.readQuery({query: FundQL.fundPageQuery, variables: { id: createFundMetrics.id } }); 
+0

谢谢丹尼尔 - 工作,所以我不得不返回基金ID,使其工作 - > {fundId:createFundQuarterlyMetric.fund.id},它的工作!非常感谢! – Blackstone4

+0

我试图投票,但我没有足够的信誉在这里... – Blackstone4

+0

@ Blackstone4没问题,很高兴你得到它的工作:)你仍然可以接受作为正确的答案 –

相关问题