Начальная пакетная установка AWS AppSync не обновляет кэш

Я использую AWS AppSync вместе с приложением angular 7 и инициализирую клиента следующим образом:

let instance: AWSAppSyncClient<NormalizedCacheObject> = new AWSAppSyncClient({
  url: environment.graphqlEndpoint,
  region: environment.region,
  auth: {
       type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
       jwtToken: async() => { //return token }
    },
    cacheOptions: {
        dataIdFromObject: (obj : any) => `${obj.__typename}:${obj.key}`
    }
});

это прекрасно работает, когда AppSync выполняет запрос, а в DynamodB уже есть запрошенные значения:

{
  "data": {
    "getDefaultSettings": [
      {
        "key": "setting_a",
        "value": "true"
      },
      {
        "key": "setting_b",
        "value": "false"
      }
    ]
  }
}

Этот результат запроса кэшируется, и когда я выполняю мутацию, ответ мутации:

{
  "data": {
    "addDefaultSettings": [
      {
        "key": "setting_a",
        "value": "false"
      },
      {
        "key": "setting_b",
        "value": "false"
      }
    ]
  }
}

заставляет кэш обновляться через сравнение ключей, которое также работает правильно.

Однако, когда еще нет значений в динамоде, выборка возвращает такой результат:

{
  "data": {
    "getDefaultSettings": [
      null,
      null
    ]
  }
}

Так что теперь этот запрос кешируется и при проведении мутации с результатом

{
  "data": {
    "addDefaultSettings": [
      {
        "key": "setting_a",
        "value": "false"
      },
      {
        "key": "setting_b",
        "value": "false"
      }
    ]
  }
}

он не может обновить кеш. Таким образом, следующие несколько раз я выполняю запрос, он берется из кеша, и я все еще получаю нулевой результат, но мне нужно немедленно обновить кеш после получения результата мутации для первоначальной пут-мутации.

Как только следующий запрос извлекает новые данные с сервера, все дальнейшие мутации немедленно обновляют кеш, потому что теперь в кеше есть записи с тем же ключом.

Так что моя проблема возникает только на начальном пути, и я не знаю, что изменить.

  • Может быть, обновить сопоставление преобразователя из
$util.toJson($ctx.result.data.$tableName)

выявить запрашиваемый ключ + нулевое значение результата?

  • Очистка кеша после первоначальной постановки?

Я определенно хотел бы использовать network-and-cache вариант как то отлично работает кроме первоначального пут.

Буду признателен, если кто-нибудь поможет мне с этим.

1 ответ

Вы не опубликовали код для своей мутации или преобразователя, поэтому я просто предполагаю, что проблема заключается в согласованности чтения DynamoDB.

  1. Попробуйте добавить "consistentRead" : true на ваш шаблон ответа мутации в AppSync.

  2. Создайте оптимистический ответ внутри шаблона ответа, как это

    ## Raise a GraphQL field error in case of a datasource invocation error
    #if($ctx.error)
        $util.error($ctx.error.message, $ctx.error.type)
    #end

    ## Pass back an optimistic result from DynamoDB. **
    #set ($items = {[{"key":"setting_a", "value": $ctx.args.setting_a}, {...}]})
    $util.toJson($items)
Другие вопросы по тегам