我使用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 = []
并保存它时,细节是一个空数组并且运行正常。所以对我而言,更新记录并将该属性设置为空数组似乎是一个特定问题,因为创建记录并将该属性设置为空数组是完美的。
如何更新记录并将详细信息设置为空数组?
答案 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。