AWS Amplify DataStore懒加载模型使用问题求助
问题拆解和修复方案
先给你捋代码里的几个关键问题,逐个解决:
1. 首先:bookings 数组根本没拿到数据
你用了bookings.concat(...),但concat是返回新数组,不会修改原数组!现在你的bookings一直是空的,后面的循环等于白跑。
改法:
把concat的结果重新赋值给bookings:
if (tutorId) { bookings = bookings.concat(await DataStore.query(Booking, (c) => c.bookingTutorId.eq(tutorId))) } else { bookings = bookings.concat(await DataStore.query(Booking)) }
2. 核心错误:用错DataStore API导致类型不匹配
你查单个Client的时候用了DataStore.query(),这个API返回的是符合条件的所有对象组成的数组(也就是报错里的LazyClient[]),但你要的是单个Client对象,直接push数组当然类型不对。
这种按主键查单个对象的场景,应该用**DataStore.get()**,它专门针对主键查询,返回的是单个对象的Promise,类型直接匹配Client。
循环里的代码改成这样:
// 这里不用for await...of,bookings是普通数组,不是异步迭代器 for (const booking of bookings) { const clientId = booking.bookingClientId; if (clientId) { // 用get根据主键查单个Client const client = await DataStore.get(Client, clientId); // 确保拿到对象再push,避免空值 if (client) { clients.push(client); } } }
如果你非要用query的话(不推荐)
如果因为特殊需求必须用query,那要取数组的第一个元素,同时处理空值:
const clientList = await DataStore.query(Client, (c) => c.id.eq(clientId!)); const client = clientList[0]; if (client) { clients.push(client); }
但还是推荐用get,更高效也更贴合你的场景。
完整修复后的代码
useEffect(() => { const getData = async () => { let clients: Client[] = []; let bookings: LazyBooking[] = []; let Inquiries: LazyInquiry[] = []; // TODO add logic to get inquiries // filter by tutor id if (tutorId) { bookings = bookings.concat(await DataStore.query(Booking, (c) => c.bookingTutorId.eq(tutorId))) // admin, get all clients } else { bookings = bookings.concat(await DataStore.query(Booking)) } // resolve the client Id into the client names for (const booking of bookings) { const clientId = booking.bookingClientId; if (clientId) { const client = await DataStore.get(Client, clientId); if (client) { clients.push(client); } } } setAllclients(clients); } getData(); }, [tutorId])
内容的提问来源于stack exchange,提问作者Lacrosse343
相关产品推荐
相关产品推荐

