当前位置: 首页 > 知识库问答 >
问题:

阿波罗反应-突变时的奇怪效果?

缪茂勋
2023-03-14

我已经用React Apollo设置了一个React应用程序,可以成功地查询我的API。

但是,当我进行突变时,会出现奇怪的效果。我成功地取回了所有数据(如Chrome开发工具的网络选项卡中所示),但是当尝试console.log数据时,它说它是null

以下是相关代码:

// mutation file

import gql from "graphql-tag";
export default gql`
  mutation CreateReservation($name: String!, $time: String!, $persons: String, $specialMessage: String, $email: String!) {
    createReservation(input: {
        name: $name,
        time: $time,
        persons: $persons,
        specialMessage: $specialMessage,
        email: $email
    }) {
        __typename
        error
        data
    }
  }
`;

// component file

import React from "react";
import {graphql, compose} from "react-apollo";
import CreateReservationMutation from "../../graphql/mutations/api/CreateReservation";

class Reservations extends React.Component {
testGraphQL = ({ reservationName, reservationTime, reservationEmail, reservationPartySize, reservationMessage}) => {

    const variables = {
        name: reservationName,
        time: reservationTime,
        persons: reservationPartySize,
        specialMessage: reservationMessage,
        email: reservationEmail
    };

    this.props.createReservation(variables)
    .then(({data}) => {
        console.log("Data received: ", data); // Here is the problem
    }).catch((err) => {
        console.log("Error sending data: ", err);
    })
}
render() {
    return (
        <div>
            ...
            <div>
                <Form 
                    ...
                    submitFunc={this.testGraphQL}
                />
            </div>
            ...
            </div>
        </div>
    )
  }
}

export default compose(
    graphql(CreateReservationMutation, {
        props: ({mutate}) => ({
            createReservation: (variables) => mutate({variables})
        })
    })
)(Reservations);

因此,当我调用testGraphQL函数时,我在控制台中收到以下内容:

Data received:  {createReservation: null}

但是在网络选项卡中查看时,我看到数据毕竟确实存在,并且正是我正在寻找的。此外,我的数据库已正确更新所有预订详细信息,因此我可以肯定地知道正在执行突变。

这是我从网络选项卡中看到的:

{"data":{"createReservation":{"__typename":"ReservationResponse","error":null,"data":"Success"}}}

这就是我在调用控制台时希望看到的。在testGraphQL中记录。

所以我知道我的模式、Apollo客户端或突变文件没有任何错误。

相反,问题在于我如何设置我的compose语句,或者我如何调用突变本身。

如果你发现这里的错误请告诉我谢谢

更新

我应该提到,我正在使用AWS AppSync作为我的GraphQL提供程序

突变调用lambda函数,该函数执行以下操作:

...
Promise.all([dynamodbPromise, snsPromise, sesPromise])
    .then((data) => {
        callback(null, {data: "Success"});
    })
    .catch((err) => {
        callback(null, {error: err});
    });

这是我的突变解决方案

// request mapping template

{
  "version" : "2017-02-28",
  "operation": "Invoke",
  "payload": $util.toJson($ctx.args.input)
}

//  response mapping template

$util.toJson($context.result)

更新2

配置optimisticResonse并如下重写我的突变:

this.props.createReservation({
        variables,
        optimisticResponse: {
            createReservation: {
                __typename: "ReservationResponse",
                errorMessage: null,
                responseMessage: "_TEST_"
            }
        }
    })
    .then(res => {
        console.log("Apllo Data: ", res);
    })

这让我只能从乐观的回答中获得数据,即:

{data:
  createReservation: {
    __typename: "ReservationResponse", 
    errorMessage: null, 
    responseMessage: "Optimistic Success"
}

因此,返回的数据不得与API的实际响应一起更新。

在返回乐观的回应后,我现在如何才能迫使阿波罗更新回应?

共有3个答案

东门玺
2023-03-14

只需使用res.data即可访问返回的属性

this.props.createReservation({
    variables,
    optimisticResponse: {
        createReservation: {
            __typename: "ReservationResponse",
            errorMessage: null,
            responseMessage: "_TEST_"
        }
    }
})
.then(res => {
    console.log("Apllo Data: ", res.data);
})
周涵畅
2023-03-14

我终于解决了这个问题,尽管解决方案并不理想。

我不得不为我的突变编写一个更新函数。这是一个准系统实现,最终为我提供了来自API的实际数据:

this.props.createReservation({
        variables,
        optimisticResponse: {
            createReservation: {
                __typename: "ReservationResponse",
                errorMessage: null,
                responseMessage: "Optimistic Success"
            }
        },
        update: (proxy, {data: {createReservation}}) => {
            console.log("Update: ", createReservation);
        }
    })
    .then(res => {
        console.log("Apllo Data: ", res);
    })

update函数被调用了三次。解决promise之前的前两次激发,包括来自optimisticResponse的数据,如我的“更新2”部分所示。第三个调用最终从API返回实际数据。

虽然这暂时有效,但请告诉我这里是否有更直接的方法。在这种情况下,我根本不希望返回乐观响应。我只希望返回我的API中的实际数据。这样,如果出现问题,我可以为我的用户提供适当的错误处理。

谢谢你,我希望我们能帮助其他有这个问题的人。

公孙智
2023-03-14

有两种方法可以从突变中获取数据响应:

在突变成分中:

<Mutation>{mutation, {data}}</Mutation>

或者在突变函数中:

mutate().then(data => ...)

您正在进入突变promise响应,但您期望阿波罗传递给突变组件的状态对象。

apollo传递state对象是没有意义的,因为如果变异成功解决,任何错误都会导致promise被拒绝,并且在mutate调用期间不会提供加载状态。

所以要修复代码,只需更改

this.props.createReservation(variables)
    .then(data => {
 类似资料:
  • 我已经在我的django石墨烯GraphiQLendpoint上测试了这种突变,并通过Altair(graphql的邮递员)在我的apollo客户端所指向的完全相同的endpoint上进行了测试。我使用相同的格式运行相同的变异,它可以与GraphiQL和Altair一起工作-新的数据库条目。 通过react apollo,它不会产生错误,我的django控制台显示: 然而,实际上没有什么击中数据库

  • Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 一、背景介绍 服务端基于 Spring Boot 和 Spring Cloud 开发,打包后可以直接运行,不需要额外安装 Tomcat 等应用容器。 Java 客户端不依赖任何框架,能

  • 我正在尝试创建一个带有字幕的视频播放器。除了一件事,一切都设置好了,工作正常。我的阿拉伯语字幕显示不正确。他们用符号之类的东西看起来很奇怪。。比如: 以下是我的ExoPlayer设置和子倾斜: 有什么解决办法吗?

  • 有人能解释一下,当我尝试使用返回错误的突变时,为什么我的react应用程序apollo会这样做? GraphQL突变返回此信息(响应代码为200):<代码>{“错误”:[{“错误”:{“结果”:“身份。未找到”,“错误”:“身份验证失败”,“状态代码”:401}}}],“数据”:{“登录”:null}} 我的突变是这样的: 打电话: 它会像预期的那样运行一段时间(呈现我自己的自定义错误组件-<代码

  • 简介 阿波罗 STM32F429 是正点原子推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 180Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32F429 的芯片性能。 开发板外观如下图所示: 该开发板常用 板载资源 如下: MCU:STM32F429IGT6,主频 180MHz,1024KB FLASH ,256KB RAM 外部 RAM:W9825G6KH(S

  • 我有一个表单组件,它从其父级获取其状态。表单组件只呈现一些输入字段和其他字段。 父组件使用useReucer并将值向下传递给表单组件。 有两个父组件,一个允许用户使用表单创建,另一个允许他们编辑。 在编辑父组件中,我使用useEffect从api获取数据,并从服务器设置初始状态。 在开发构建中,当组件呈现时,有时会出现以下错误: 超过最大更新深度。当组件在componentWillUpdate或c