Reactjs / Apollo / AppSync Мутация срабатывает дважды

У меня проблема с React / Apollo / AppSync, когда мутации срабатывают дважды (или чаще). У меня есть приложение React, в котором мутация обновления запускается обычной кнопкой пользовательского интерфейса onClick.

<button className={`btn btn-sm`} onClick={(event) => { that.toggleSubscription(event, subscriptionid, serviceid, status); }}>
    <i className={`fas ${icon} fa-fw`} />
    {title}
</button>

Функция toggleSubscription выглядит так:

toggleSubscription = async (event, subscriptionid, serviceid, currentStatus) => {
    event.preventDefault();
    event.stopPropagation();

    if (currentStatus === "mandatory") return;
    console.log(serviceid);
    await this.props.toggleSubscription(this.props.match.params.id, serviceid);
}

И рассматриваемая мутация graphql (хотя, похоже, это происходит со всеми мутациями). Это в заявлении об экспорте:

export default compose(
    graphql(
        MutationToggleSubscription,
        {
            props: ({ ownProps, mutate }) => ({
                toggleSubscription: (personid, serviceid) => mutate({
                    variables: { personid: personid, serviceid: serviceid }
                })
            }),
        }
    ),
...

Показывает несколько одновременных вызовов к серверу GraphQL Вызовы почти идентично, но есть несколько дополнительных вызовов stacktrace: Эти два запроса почти идентичны. Похоже, что вызовы, выделенные красным, и есть разница между ними

Любая помощь будет очень признательна!


person Gareth Bradley    schedule 19.01.2018    source источник
comment
Можешь попробовать еще раз? Произошло обновление AppSync JavaScript SDK, которое больше не требует от вас использования оптимистичного ответа, что в то время могло быть причиной того, что это происходило. Также теперь вы можете использовать disableOffline:true в конструкторе, если вам не нужны автономные функции. Подробнее здесь: docs.aws.amazon.com/appsync/latest/devguide/   -  person Richard    schedule 15.02.2018


Ответы (2)


У меня такая же проблема. В моем случае мутация длится долго. Преобразователь мутаций вызывался дважды, потому что на сервер отправлялся второй запрос POST. Но клиент делал только один запрос, что было видно на вкладке «Сеть» в инструментах разработчика браузера.

Как я выяснил, проблема не была вызвана сервером apollo или клиентом.

После долгих исследований я обнаружил, что сервер Node.js по умолчанию отключает запрос через 120 секунд и закрывает соединение с клиентом. Это, в свою очередь, приводит к тому, что браузер повторяет запрос, но браузер не регистрирует эту повторную попытку запрос на вкладке сети в инструментах разработчика, что вызывает много недоразумений.

Итак, изменение времени ожидания запроса на сервере ExpressJS решило проблему для меня.

Первоначально опубликовано здесь

person Yashas    schedule 27.07.2020

Можете ли вы дать оптимистичный ответ?

например https://github.com/aws-samples/aws-mobile-appsync-events-starter-react/blob/362efe95af89c01af46696cc356d0f5922d27bf5/src/Components/NewEvent.js#L122-L126

Клиенту AppSync в настоящее время требуется наличие optimisticResponse как части мутации.

person Manuel Iglesias    schedule 19.01.2018