如何从Lambda函数正确写入AWS Amplify DynamoDB并在Flutter端查询到数据
问题排查及解决方案
原因1:缺失Amplify要求的系统字段
Amplify 自动生成的 DynamoDB 表默认包含3个必填系统字段,用于DataStore的增量同步、冲突检测,Lambda写入时未携带这些字段会导致记录被DataStore同步逻辑忽略:
_version:初始写入填1即可_lastChangedAt:填写当前Unix时间戳(毫秒级)_deleted:初始写入填false
修正后的Lambda代码如下:
'use strict'; var AWS = require('aws-sdk'), mydocumentClient = new AWS.DynamoDB.DocumentClient(); exports.handler = function(event, context, callback){ const now = Date.now(); var params = { Item : { id : '12345', "senderID" : "test", "recieverID" : "test", "message" : "test", // 新增Amplify要求的系统字段 "_version": 1, "_lastChangedAt": now, "_deleted": false }, TableName : 'Chat-hdwvylbm45a23azaykzyshblu4-staging' } mydocumentClient.put(params, function(err, data){ callback(err, data); }) }
原因2:DataStore本地缓存未触发全量同步
如果是Lambda写入后立刻查询,DataStore可能还未完成云端新数据的同步,可按如下方式处理:
- 调用
Amplify.DataStore.clear()清空本地缓存后重新查询,强制触发全量同步 - 或者在查询前主动调用
Amplify.DataStore.start()确保同步服务处于运行状态
修正后的Flutter查询代码参考:
Future<void> read() async { try { // 可选:强制同步最新数据 await Amplify.DataStore.clear(); List<Chat> chatItems = await Amplify.DataStore.query(Chat.classType); setState(() { randomExcerciseData = chatItems; }); } on Exception catch (e) { print('Query failed: $e'); } }
其他需要确认的点
- 确认Flutter端Amplify使用的环境与Lambda写入的表环境一致(当前Lambda写入的是staging环境表,确认Flutter未切换成prod等其他环境)
- 确认DynamoDB中Lambda写入的记录字段名、字段类型与Amplify schema中定义的Chat模型完全匹配,大小写、拼写错误都会导致DataStore无法解析记录(比如注意你代码里的
recieverID是不是拼写错误,正确应该是receiverID,如果schema里是正确拼写,这里字段名不匹配也会导致无法查询)
内容的提问来源于stack exchange,提问作者Gabby10
相关产品推荐
相关产品推荐

