gpt4 book ai didi

amazon-web-services - 即使离线被禁用,AWS AppSync 查询也会返回缓存的响应

转载 作者:行者123 更新时间:2023-12-04 08:06:02 26 4
gpt4 key购买 nike

我有一个使用 AWS AppSync 的相当简单的节点应用程序。我能够成功运行查询和更改,但我最近发现,如果我运行查询两次,我会得到相同的响应 - 即使我知道后端数据已更改。在这种特殊情况下,查询由 lambda 支持,在深入研究时,我发现该查询似乎并未在网络上发送,因为每次运行查询时都不会触发 lambda - 只是第一次.如果我使用控制台来模拟我的查询,那么一切运行正常。如果我重新启动我的应用程序,那么第一次运行查询时它可以正常工作,但连续查询每次只返回相同的值。

这是我的代码的一部分:

  client.query({
query: gql`
query GetAbc($cId: String!) {
getAbc(cId: $cId) {
id
name
cs
}
}`,
options: {
fetchPolicy: 'no-cache'
},
variables: {
cid: event.cid
}
})
.then((data) => {
// same data every time
})

编辑 : 尝试其他获取策略,如 network-only没有明显的区别。

这是我设置客户端的方式,不是 super 干净,但似乎有效:
const makeAWSAppSyncClient = (credentials) => {
return Promise.resolve(
new AWSAppSyncClient({
url: 'lalala',
region: 'us-west-2',
auth: {
type: 'AWS_IAM',
credentials: () => {
return credentials
}
},
disableOffline: true
})
)
}

getRemoteCredentials()
.then((credentials) => {
return makeAWSAppSyncClient(credentials)
})
.then((client) => {
return client.hydrated()
})
.then((client) => {
// client is good to use
})
getRemoteCredentials是一种将 IoT 身份验证转换为可与其他 AWS 开发工具包一起使用的普通 IAM 凭证的方法。这是有效的(因为如果没有,我就不会走得那么远)。

我的问题似乎与这个问题非常相似 GraphQL Query Runs Sucessfully One Time and Fails To Run Again using Apollo and AWS AppSync ;我在节点环境中运行(而不是 react ),但它本质上是相同的问题。

我不认为这是相关的,但为了完整起见,我应该提到我已经尝试过使用和不使用文档中的设置代码。这似乎没有什么区别(除了烦人的日志记录,见下文)但这里是:
global.WebSocket = require('ws')
global.window = global.window || {
setTimeout: setTimeout,
clearTimeout: clearTimeout,
WebSocket: global.WebSocket,
ArrayBuffer: global.ArrayBuffer,
addEventListener: function () { },
navigator: { onLine: true }
}

global.localStorage = {
store: {},
getItem: function (key) {
return this.store[key]
},
setItem: function (key, value) {
this.store[key] = value
},
removeItem: function (key) {
delete this.store[key]
}
};
require('es6-promise').polyfill()
require('isomorphic-fetch')

这是取自: https://docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-javascript.html

使用此代码而不使用 offlineDisabled: true在客户端设置中,我看到此行在控制台上不断喷出:

redux-persist asyncLocalStorage requires a global localStorage object. Either use a different storage backend or if this is a universal redux application you probably should conditionally persist like so: https://gist.github.com/rt2zz/ac9eb396793f95ff3c3b



然而,这对这个问题没有明显的区别。

更新 :我来自 package.json 的依赖项,我在测试期间升级了这些,所以我的 yarn.lock 包含比这里列出的更多的最新修订。尽管如此: https://gist.github.com/macbutch/a319a2a7059adc3f68b9f9627598a8ca

更新 #2 :我还从 CloudWatch 日志中确认该查询仅运行一次;我有一个在计时器上定期运行的突变,该计时器已成功调用并在 CloudWatch 中可见。这正如我所期望的那样工作,但查询不是。

更新 #3 :我已经调试到 AppSync/Apollo 代码中,可以看到我的 fetchPolicy 在此代码中更改为“缓存优先” apollo-client/core/QueryManager.js (我的评论):
QueryManager.prototype.fetchQuery = function (queryId, options, fetchType, fetchMoreForQueryId) {
var _this = this;
// Next line changes options.fetchPolicy to 'cache-first'
var _a = options.variables, variables = _a === void 0 ? {} : _a, _b = options.metadata, metadata = _b === void 0 ? null : _b, _c = options.fetchPolicy, fetchPolicy = _c === void 0 ? 'cache-first' : _c;
var cache = this.dataStore.getCache();
var query = cache.transformDocument(options.query);
var storeResult;
var needToFetch = fetchPolicy === 'network-only' || fetchPolicy === 'no-cache';
// needToFetch is false (because fetchPolicy is 'cache-first')
if (fetchType !== FetchType.refetch &&
fetchPolicy !== 'network-only' &&
fetchPolicy !== 'no-cache') {
// so we come through this branch
var _d = this.dataStore.getCache().diff({
query: query,
variables: variables,
returnPartialData: true,
optimistic: false,
}), complete = _d.complete, result = _d.result;
// here complete is true, result is from the cache
needToFetch = !complete || fetchPolicy === 'cache-and-network';
// needToFetch is still false
storeResult = result;
}
// skipping some stuff
...
if (shouldFetch) { // shouldFetch is still false so this doesn't execute
var networkResult = this.fetchRequest({
requestId: requestId,
queryId: queryId,
document: query,
options: options,
fetchMoreForQueryId: fetchMoreForQueryId,
}
// resolve with data from cache
return Promise.resolve({ data: storeResult });

如果我使用调试器更改 shouldFetch 的值为 true 那么至少我看到一个网络请求出去并且我的 lambda 执行。我想我需要解开改变我的 fetchPolicy 的那一行正在做的事情。

最佳答案

好的,我发现了问题。这是我的问题中代码的缩写版本:

 client.query({
query: gql`...`,
options: {
fetchPolicy: 'no-cache'
},
variables: { ... }
})

更容易看出这里出了什么问题。这是应该的:
 client.query({
query: gql`...`,
fetchPolicy: 'network-only'
variables: { ... }
})

我原来的两个问题:
  • fetchPolicy: 'no-cache'在这里似乎不起作用(我得到一个空的回复)
  • fetchPolicyoptions对象是不必要的

  • graphql 客户端以不同的方式指定选项,我们在两者之间切换。

    关于amazon-web-services - 即使离线被禁用,AWS AppSync 查询也会返回缓存的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51306956/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com