DynamoDB写入含原有数组的数据时触发undefined值错误排查
DynamoDB列表属性更新问题解答
问题根源
不是DynamoDB禁止使用自身返回的数组,而是你从DynamoDB查询得到的studentOrders数组是经过SDK包装后的对象——它表面是普通数组,但内部附带了SDK添加的隐藏元数据或原型属性,这些属性里存在undefined值。即便你把marshall的removeUndefinedValues设为false,DynamoDB的写入校验依然会检测到这些无效值,触发报错。而你新创建的数组是纯原生JS数组,没有这些附加属性,所以能正常写入。
正确更新列表属性的两种方式
纯数组拷贝后修改
对查询回来的数组做浅拷贝,生成一个干净的原生JS数组,再添加新元素后执行put:// 浅拷贝原数组,避免携带SDK附加属性 const cleanOrders = [...studentOrders]; cleanOrders.push(newOrder); // 用cleanOrders替换原对象中的orders字段后执行put操作也可以用
concat直接生成新数组:const updatedOrders = studentOrders.concat(newOrder);使用UpdateExpression增量更新(推荐)
不需要拉取整个数组再全量写入,直接通过DynamoDB的UpdateExpression做增量追加,既高效又能避免SDK包装对象的问题:await docClient.send(new UpdateCommand({ TableName: "你的表名", Key: { userId: "xxx", sessionId: "xxx" }, UpdateExpression: "SET orders = list_append(orders, :newOrder)", ExpressionAttributeValues: { ":newOrder": [newOrder] // list_append要求参数是数组 }, ReturnValues: "UPDATED_NEW" // 可选,返回更新后的数据 }));这种方式只传递要追加的新元素,不需要处理原数组的包装问题,同时减少了数据传输量,性能更优。
内容的提问来源于stack exchange,提问作者Grieze
相关产品推荐
相关产品推荐

