当我尝试使用
PutCommand
将 JavaScript 对象持久保存到 DynamoDB 时,我看到以下错误消息:
Error: Pass options.removeUndefinedValues=true to remove undefined values from map/array/set.
当我使用
DynamoDBDocumentClient
时会发生这种情况
当我使用
DynamoDBClient
时,我必须首先使用 marshall(..)
中的 @aws-sdk/util-dynamodb
编组对象。 在这种情况下,当我尝试封送对象时会显示错误。
当我将对象打印到控制台时,我没有看到任何未定义的值。但是,由于嵌套层次太多,我看不到完整的对象:
{ id: 123, child: { anotherChild: { nested: [Object] } } }
所以我使用
JSON.stringify(..)
来显示整个对象:
{
"id": 123,
"child": {
"anotherChild": {
"nested": {
"name": "Jane"
}
}
}
}
我显然没有任何未定义的属性,那么为什么我会看到错误消息?
如果
marshal(..)
函数遇到未定义的属性,将会抛出此错误。
marshall({
name: "John",
age: undefined,
})
我的对象did有一个未定义的值,但事实证明
JSON.stringify(..)
将删除具有未定义值的属性。
我必须向
JSON.stringify(..)
添加“替换函数”才能查看(并修复)未定义的值。
import {marshall} from "@aws-sdk/util-dynamodb";
const myObject = {
id: 123,
child: {
anotherChild: {
nested: {
name: "Jane",
age: undefined,
},
},
},
};
// Doesn't show the undefined value (too many levels of nesting)
console.log(myObject);
// Doesn't show the undefined value (silently removes undefined attributes)
console.log(JSON.stringify(myObject));
// DOES show the undefined value
console.log(JSON.stringify(myObject, (k, v) => v === undefined ? "!!! WARNING UNDEFINED" : v));
// The marshall function throws an error due to the presence of an undefined attribute
marshall(myObject);
您现在可以在
removeUndefinedValues: true
函数的第二个参数处使用 marshall()
来删除项目的未定义值
const input: PutItemCommandInput = {
TableName: 'your-tablename',
Item: marshall({item}, { removeUndefinedValues: true }),
};