【问题标题】:Dynamoose/DynamoDB update saving empty array as nullDynamoose/DynamoDB 更新将空数组保存为空
【发布时间】:2016-08-02 18:23:41
【问题描述】:

我正在使用 Node.js 包 Dynamoose 来处理我的 Web 应用程序中的 DynamoDB 请求。

问题是当我尝试更新项目时,只要 JSON 对象包含一个空数组 Dynamoose 似乎将其设置为 null。或者,据我所知,它可能是 DynamoDB。

以下是我用于此表的架构的一部分。

var NoteSchema = new dynamoose.Schema({
    _id: String,
    details: Array
});

在下面的代码中,变量body 设置为{details: []}。我已经通过运行console.log(body); 确认了这一点。

Note.update({
    _id: searchid
}, body, function(err, note) {
    if (err) {
        console.log(err);
    } else {
        console.log(note);
    }
});

问题在于运行console.log(note);时的回调函数details甚至根本没有出现。所以它是空的或未定义的。再次在 Amazon Web Services 中,details 根本不存在该条目。

奇怪的是,当创建一个新的 Note,设置 details = [] 并保存它时, details 是一个空数组并且可以完美地工作。所以对我来说,更新记录并将该属性设置为空数组似乎是一个特定问题,因为创建记录并将该属性设置为空数组非常有效。

如何更新记录并将详细信息设置为空数组?

【问题讨论】:

    标签: javascript arrays node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    想通了。将 this issue 提交到 GitHub 存储库。基本上以下代码行(lib/Model.js about line 396)检查该值是否是长度为 0 的数组。如果是,它将删除该值将 JSON 密钥发送到 AWS 之前。

    if(val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)) {
    

    我使用我的fork 提交了pull request。在那个拉取请求中,我进行了更改以允许将选项的 optional JSON 对象参数传递到更新函数中。这是更新函数的第三个参数,就在回调函数之前。如果有一个名为emptyarrayallowed 的键并且该值设置为true,那么您上面的那一行将变为以下内容。

    if(val === null || val === undefined || val === '') {
    

    例如,在我上面的示例中,将更新功能更改为以下将起作用(只要您使用我的 fork 或拉取请求已被批准)。

    Note.update({_id: searchid}, body, {"emptyarrayallowed": true}, function(err, note) {
        if (err) {
            console.log(err);
        } else {
            console.log(note);
        }
    });
    

    如果您对此解决方案有任何疑问,请告诉我。

    【讨论】:

      【解决方案2】:

      Charlie's answer 的小更新。正如查理所说,该功能已合并。但是,看起来属性名称已从 emptyarrayallowed 重命名为 allowEmptyArray。

      【讨论】:

        猜你喜欢
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 2020-07-06
        • 2019-12-30
        • 2023-01-27
        • 1970-01-01
        • 2020-02-17
        相关资源
        最近更新 更多