Начальная пакетная установка 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.
Попробуйте добавить
"consistentRead" : true
на ваш шаблон ответа мутации в AppSync.Создайте оптимистический ответ внутри шаблона ответа, как это
## 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)