AWS Amplify Gen 2项目中同时使用DynamoDB与已有AppSync GraphQL API的配置问题
当然可以同时使用这两个服务!你遇到的问题核心是直接覆盖了Amplify Gen2自动生成的默认GraphQL配置,导致原有DynamoDB对应的API配置被冲掉了。别担心,只要给不同的API配置设置「命名客户端」,就能轻松区分它们,让两个API同时工作。
解决思路
Amplify支持配置多个命名GraphQL客户端,默认情况下Gen2会为你创建的DynamoDB资源生成一个default客户端。你只需要在现有配置基础上,额外添加已有AppSync API的命名客户端,而不是直接替换整个GraphQL配置。
具体步骤
1. 正确配置Amplify,添加多客户端
首先,保留Gen2自动生成的amplifyconfiguration.json配置(里面包含你DynamoDB对应的GraphQL API信息),然后在Amplify.configure中扩展配置,添加已有AppSync的客户端:
import { Amplify } from 'aws-amplify'; import config from '@/amplifyconfiguration.json'; // Gen2自动生成的配置文件 Amplify.configure({ ...config, // 保留Gen2的默认配置 API: { ...config.API, GraphQL: { ...config.API.GraphQL, // 添加已有AppSync API的命名客户端,这里命名为existingAppSync,你可以自定义 existingAppSync: { apiKey: "da2-XXXXXXXXXXXXXXXXXX", region: "us-east-1", defaultAuthMode: "apiKey", endpoint: "https://XXXXXXXXXXXXX.appsync-api.us-east-1.amazonaws.com/graphql" } } } });
这样既保留了原有DynamoDB API的配置,又新增了外部AppSync的配置,两者不会冲突。
2. 调用API时指定对应的客户端
调用Gen2自己的DynamoDB GraphQL API:直接使用默认客户端即可,不需要额外指定:
import { generateClient } from 'aws-amplify/api'; import { listItems } from '@/graphql/queries'; // Gen2自动生成的查询文件 const defaultClient = generateClient(); const dynamodbData = await defaultClient.graphql({ query: listItems });调用已有AppSync API:生成客户端时指定
clientName为你刚才配置的名称(比如existingAppSync),同时使用你通过codegen生成的外部API查询文件:import { generateClient } from 'aws-amplify/api'; // 这里用你单独生成的外部API查询文件,建议放在独立目录区分 import { listExistingRecords } from '@/graphql-existing/queries'; const externalAppSyncClient = generateClient({ clientName: 'existingAppSync' }); const externalData = await externalAppSyncClient.graphql({ query: listExistingRecords });
3. Codegen时避免文件冲突
当你运行amplify add codegen导入已有AppSync API时,建议指定单独的输出目录,避免和Gen2自动生成的graphql文件混在一起:
amplify add codegen --apiId XXXXXXXXXXXXXXX --output-dir src/graphql-existing
这样外部API的查询、突变文件都会放在graphql-existing目录下,方便你区分调用。
总结
只要通过「命名客户端」的方式配置多个GraphQL API,就能同时使用Gen2项目的DynamoDB资源和外部AppSync API,再也不用二选一啦!
备注:内容来源于stack exchange,提问作者Robert M

