函数抱怨未定义的值

问题描述 投票:0回答:3

当我尝试使用

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"
            }
        }
    }
}

我显然没有任何未定义的属性,那么为什么我会看到错误消息?

javascript typescript amazon-dynamodb
3个回答
13
投票

如果

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);

11
投票

您应该使用

translateConfig
对象来指定
marshall
unmarshall
的行为,如下所述:

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_lib_dynamodb.html#configuration

您可以使用以下设置来处理

undefined
值。


0
投票

您现在可以在

removeUndefinedValues: true
函数的第二个参数处使用
marshall()
来删除项目的未定义值

const input: PutItemCommandInput = {
    TableName: 'your-tablename',
    Item: marshall({item}, { removeUndefinedValues: true }),
};
© www.soinside.com 2019 - 2024. All rights reserved.