Начальная пакетная установка AWS AppSync не обновляет кэш - PullRequest
0 голосов
/ 16 января 2019

Я использую 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 Ответ

0 голосов
/ 18 января 2019

Вы не опубликовали код для своей мутации или преобразователя, поэтому я просто предполагаю, что проблема заключается в согласованности чтения 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)
...