AWS Amplify新增数据后列表查询无法即时获取问题求助
更新AWS Amplify后出现异常:自动生成的GraphQL mutation createBooking 能成功将数据写入数据库,但调用listBookings查询新数据时,存在间歇性无法即时返回的情况——有时重复保存多次才能查到,有时又能正常返回。自上次Amplify更新后未修改任何业务代码,尝试清空旧数据、提高查询limit值后问题仍存在。
创建数据核心代码
await API.graphql({ query: mutations.createBooking, variables: { input: data } })
列表查询核心代码
const serviceData = await API.graphql(graphqlOperation(listBookings, { filter: { date: { eq: selectedDate } }, limit: 999999999 }))
完整业务代码
保存数据函数
async function saveData() { setIsSending(true); try { await API.graphql({ query: mutations.createBooking, variables: { input: data } }) .then(async i => { const getService = services.filter(i => i.id === data.service)[0]; let temp = { ...data, date: `${stringDate.dayname} ${stringDate.dd} ${stringDate.mm} ${stringDate.yyyy}`, service: getService.name, address: data.shouldPickup ? data.address : "Adress" } await emailjs.send( process.env.REACT_APP_ENV_EMAILJS_SERVICE_ID, process.env.REACT_APP_ENV_EMAILJS_TEMPLATE_ID, temp, process.env.REACT_APP_ENV_EMAILJS_PUB_KEY) .then((result) => { setIsSending(false); }, (error) => { console.log(error.text); }); runSuccesAlert() handleClose(); }) .catch(i => { setAlertMsg({ severity: "error", msg: "Något gick fel i systemet, prova ringa/maila medan vi fixar det.", }) console.log("Err", JSON.stringify(i)) }) } catch (err) { console.log('error fetching services', err) } }
查询数据函数
async function getAllDates() { try { const serviceData = await API.graphql(graphqlOperation(listBookings, { filter: { date: { eq: selectedDate } }, limit: 999999999 })) const s = serviceData.data.listBookings.items; let dates = []; if (s.length !== 0) { dates = s.filter(i => !i._deleted).map(t => t.time); } const d = dateName(selectedDate, dates); setAvailableTimes(d.availableTime); setData(prevState => { return { ...prevState, time: d.availableTime[0] || null } }); setStringDate(d); setData(prevState => { return { ...prevState, date: selectedDate } }); } catch (err) { console.log('error fetching services', err) } }
确认数据已成功写入
createBooking返回结果显示数据已成功保存:
{ "createBooking": { "id": "4020a839-b951-4288-9663-06c59d69a263", "service": "51516cf1-e490-433e-989d-adfa829ea345", "date": "2023-03-09T14:05:49.748Z", "email": "boka@boka.com", "phone": "070000", "address": "", "approvedTerms": true, "name": "bokaupp", "time": "19:00", "shouldPickup": false, "createdAt": "2023-03-09T14:06:27.090Z", "updatedAt": "2023-03-09T14:06:27.090Z", "_version": 1, "_deleted": null, "_lastChangedAt": 1678370787109 } }
排查与解决建议
检查日期字段格式一致性
从返回结果看,createBooking存入的date是ISO格式字符串(2023-03-09T14:05:49.748Z),但查询时使用的selectedDate格式可能不匹配。确认selectedDate是否和存入的date完全一致,避免因格式差异导致过滤失效。禁用Amplify GraphQL缓存
Amplify默认开启了GraphQL查询缓存,可能导致新写入的数据无法即时被查询到。在查询时添加fetchPolicy: 'network-only'强制从网络获取最新数据:const serviceData = await API.graphql(graphqlOperation(listBookings, { filter: { date: { eq: selectedDate } }, limit: 999999999 }), { fetchPolicy: 'network-only' })修复async/await混用问题
saveData函数中同时使用了await和.then(),可能导致代码执行顺序混乱。建议统一使用await写法,避免嵌套:async function saveData() { setIsSending(true); try { const createResult = await API.graphql({ query: mutations.createBooking, variables: { input: data } }); const getService = services.filter(i => i.id === data.service)[0]; let temp = { ...data, date: `${stringDate.dayname} ${stringDate.dd} ${stringDate.mm} ${stringDate.yyyy}`, service: getService.name, address: data.shouldPickup ? data.address : "Adress" }; try { await emailjs.send( process.env.REACT_APP_ENV_EMAILJS_SERVICE_ID, process.env.REACT_APP_ENV_EMAILJS_TEMPLATE_ID, temp, process.env.REACT_APP_ENV_EMAILJS_PUB_KEY ); } catch (emailErr) { console.log(emailErr.text); } setIsSending(false); runSuccesAlert(); handleClose(); } catch (err) { setAlertMsg({ severity: "error", msg: "Något gick fel i systemet, prova ringa/maila medan vi fixar det.", }); console.log("Err", JSON.stringify(err)); setIsSending(false); } }检查DynamoDB一致性设置
如果使用DynamoDB作为数据源,默认的查询是最终一致性,新写入的数据可能需要短暂时间才能被查询到。可以在GraphQL查询中添加consistentRead: true启用强一致性查询(注意会增加开销):const serviceData = await API.graphql(graphqlOperation(listBookings, { filter: { date: { eq: selectedDate } }, limit: 999999999, consistentRead: true }))回退Amplify版本验证
问题出现在Amplify更新后,可尝试回退到之前能正常工作的版本,确认是否为版本兼容性问题。比如:npm install aws-amplify@<旧版本号>
内容的提问来源于stack exchange,提问作者saman93

