Dynamoose / DynamoDB更新将空数组保存为null

时间:2016-08-02 18:23:42

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

我使用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时,问题在于回调函数内部甚至根本没有出现。所以它是null或undefined。在亚马逊网络服务中,再次details根本不存在该条目。

有什么奇怪的是,在创建一个新的Note,设置details = []并保存它时,细节是一个空数组并且运行正常。所以对我而言,更新记录并将该属性设置为空数组似乎是一个特定问题,因为创建记录并将该属性设置为空数组是完美的。

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

2 个答案:

答案 0 :(得分:2)

想出来了。向GitHub回购提交this issue。基本上以下代码行( lib / Model.js 关于第396行)代码检查该值是否为长度为0的数组。如果是这样,它将删除该行将JSON密钥发送给AWS之前的密钥。

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

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

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

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

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

如果您对此解决方案有任何疑问,请与我们联系。

答案 1 :(得分:0)

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