如何在AWS AppSync兄弟字段解析器间共享API结果并保持响应扁平
实现GraphQL字段共享单次API调用并保持扁平响应
完全可以做到。核心思路是通过缓存API响应,让files和continuation_token字段复用同一份后端数据,避免重复调用,同时保持响应结构的扁平化。以下是两种常见实现方式:
方式一:利用父对象存储API数据
如果page_id是FileStorage类型的顶层参数(比如通过Query的fileStorage传入),可以在FileStorage的根解析器中先调用一次API,把结果存入返回对象,子字段直接读取该数据:
const resolvers = { Query: { // Query层获取FileStorage时,先调用后端API并缓存结果 async fileStorage(_, { page_id }) { const apiResponse = await fetch('/s3files', { method: 'POST', body: JSON.stringify({ page_id }) }).then(res => res.json()); // 将API响应存入返回对象的私有字段,供子字段复用 return { _cachedData: apiResponse }; } }, FileStorage: { // files字段直接读取缓存中的数据 files(parent) { return parent._cachedData.files; }, // continuation_token字段同理 continuation_token(parent) { return parent._cachedData.continuation_token; } } };
这种方式下,无论客户端请求files、continuation_token还是同时请求两者,只会触发一次后端API调用,且响应结构完全符合你需要的扁平格式。
方式二:用DataLoader缓存请求(适用于参数在子字段的场景)
如果page_id是files字段的专属参数,可以通过DataLoader按page_id缓存API响应,确保相同参数的请求只调用一次API:
// 初始化DataLoader,按page_id缓存API结果 const fileDataLoader = new DataLoader(async (pageIds) => { return Promise.all(pageIds.map(pageId => fetch('/s3files', { method: 'POST', body: JSON.stringify({ page_id: pageId }) }).then(res => res.json()) )); }); const resolvers = { FileStorage: { async files(_, { page_id }) { const apiData = await fileDataLoader.load(page_id); return apiData.files; }, async continuation_token(_, { page_id }) { // 相同page_id会直接读取缓存,不会重复调用API const apiData = await fileDataLoader.load(page_id); return apiData.continuation_token; } } };
DataLoader会自动去重相同的page_id请求,确保同一参数下只会发起一次API调用,同时保持响应结构扁平化。
注意事项
- 如果
continuation_token不依赖page_id,需调整缓存逻辑,确保API调用的参数一致性; - 私有字段(如
_cachedData)不会出现在最终的GraphQL响应中,完全不影响返回结构。
内容的提问来源于stack exchange,提问作者DarkPhoenix
相关产品推荐
相关产品推荐

