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

AWS Amplify新增数据后列表查询无法即时获取问题求助

AWS Amplify更新后GraphQL查询新创建数据异常问题

更新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
    }
}

排查与解决建议

  1. 检查日期字段格式一致性
    从返回结果看,createBooking存入的date是ISO格式字符串(2023-03-09T14:05:49.748Z),但查询时使用的selectedDate格式可能不匹配。确认selectedDate是否和存入的date完全一致,避免因格式差异导致过滤失效。

  2. 禁用Amplify GraphQL缓存
    Amplify默认开启了GraphQL查询缓存,可能导致新写入的数据无法即时被查询到。在查询时添加fetchPolicy: 'network-only'强制从网络获取最新数据:

    const serviceData = await API.graphql(graphqlOperation(listBookings, {
      filter: {
        date: {
          eq: selectedDate
        }
      },
      limit: 999999999
    }), { fetchPolicy: 'network-only' })
    
  3. 修复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);
      }
    }
    
  4. 检查DynamoDB一致性设置
    如果使用DynamoDB作为数据源,默认的查询是最终一致性,新写入的数据可能需要短暂时间才能被查询到。可以在GraphQL查询中添加consistentRead: true启用强一致性查询(注意会增加开销):

    const serviceData = await API.graphql(graphqlOperation(listBookings, {
      filter: {
        date: {
          eq: selectedDate
        }
      },
      limit: 999999999,
      consistentRead: true
    }))
    
  5. 回退Amplify版本验证
    问题出现在Amplify更新后,可尝试回退到之前能正常工作的版本,确认是否为版本兼容性问题。比如:

    npm install aws-amplify@<旧版本号>
    

内容的提问来源于stack exchange,提问作者saman93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:35:36