You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:59:55