AWS Amplify GraphQL查询异常:数据成功写入后端但查询返回空数组
我来帮你梳理下可能的问题点和解决办法,看起来你已经成功把数据保存到后端,但查询时拿不到结果,以下是几个常见的原因:
1. 查询条件的语法错误
你当前的查询代码里,c => c.id(userUuid) 不符合Amplify DataStore的查询语法——DataStore的查询条件需要使用操作符方法(比如eq、contains等),而不是直接调用字段。另外,如果是根据ID查询单个记录,更推荐使用DataStore.get()而不是query(query默认返回列表)。
修正后的查询代码:
const getFixtures = async () => { // 方式1:用get查询单个ID对应的记录 const clubProfile = await DataStore.get(ClubProfile, userUuid); // 方式2:如果用query,需要正确使用操作符 // const clubProfiles = await DataStore.query(ClubProfile, c => c.id.eq(userUuid)); // const clubProfile = clubProfiles[0]; if (clubProfile) { setFixturesListData(clubProfile.fixtures); console.log('fixtures here', clubProfile); } else { console.log('未找到匹配的ClubProfile记录'); } };
2. DataStore同步延迟
Amplify DataStore是离线优先的,保存数据后可能需要一点时间同步到本地缓存和云端。如果在保存后立即查询,可能还没完成同步。
你可以监听DataStore的同步状态,等同步完成后再执行查询:
import { Hub } from 'aws-amplify'; // 在组件初始化或合适的地方监听同步状态 Hub.listen('datastore', (data) => { const { event } = data.payload; if (event === 'ready') { console.log('DataStore同步完成,开始查询'); getFixtures(); } }); // 保存数据的代码保持不变 const clubInfo = async () => { let uuid = customerInfo.customerInfo.attributes.sub; const newClub = { id: uuid, club_name: clubName, club_email: clubEmail, club_number: clubPhone, // 注意:你的ClubProfile模型里没有club_location字段,这个会被忽略 // club_location: clubLocation, club_website: 'https://www.clubWebsite.com', club_teams: {clubTeams}, club_description: 'clubDescription', }; await DataStore.save(new ClubProfile(newClub)); console.log('newClub', newClub); setNewClub(newClub); };
3. 模型定义缺少关联字段
从你提供的ClubProfile模型定义来看,里面并没有fixtures字段,但你查询后试图访问clubProfile.fixtures。这说明你的GraphQL Schema可能没有正确定义ClubProfile和Fixture的关联关系(比如@hasMany)。
检查你的schema.graphql,确保关联关系正确:
type ClubProfile @model { id: ID! club_email: String club_name: String club_number: String club_description: String club_website: String club_teams: String createdAt: String updatedAt: String # 定义与Fixture的一对多关联 fixtures: [Fixture] @hasMany(indexName: "byClub", fields: ["id"]) } type Fixture @model { id: ID! # Fixture的其他字段 clubProfileId: ID! @index(name: "byClub", sortKeyFields: ["createdAt"]) }
如果没有定义这个关联,clubProfile.fixtures自然会是undefined或空数组。
4. 保存数据时的字段不匹配
你保存的newClub里包含club_location字段,但你的ClubProfile模型里并没有这个属性,DataStore会自动忽略这个不存在的字段。虽然这不是查询空数组的直接原因,但建议确保保存的字段与模型定义完全匹配,避免其他潜在问题。
先从修正查询语法和检查模型关联开始排查,这两个是最常见的原因。如果还是有问题,可以尝试清除DataStore本地缓存(比如卸载重装APP,或者调用DataStore.clear())后重新保存和查询。
内容的提问来源于stack exchange,提问作者Jason Byron Beedle

