我正在使用Node.js包Dynamose来处理web应用程序中的DynamoDB请求。
问题是,每当JSON对象包含空数组时,当我尝试更新该项时,Dynamose似乎将其设置为null。或者我所知道的可能是迪纳摩。
下面是我在这个表中使用的模式的一部分。
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或未定义的。在亚马逊网络服务中,details
对于该条目来说根本不存在。
奇怪的是,当创建一个新的Note、设置details = []
并保存它时,details是一个空数组,并且工作得很好。因此,在我看来,更新记录并将该属性设置为空数组似乎是一个特定的问题,因为创建记录并将其设置为空阵列非常有效。
如何更新记录并将详细信息设置为空数组?
想明白了。已将此问题提交到GitHub回购。基本上,下面的代码行(lib/Model.js关于第396行)检查该值是否为长度为0的数组。如果是这样,它将在将JSON密钥发送到AWS之前删除该密钥。
if(val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)) {
我使用fork提交了一个pull请求。在那个pull请求中,我进行了更改,允许将选项的可选JSON对象参数传递到更新函数中。这是更新函数的第三个参数,就在回调函数之前。如果有一个名为emptyarrayallowed
的键,并且该值被设置为true
,那么上面的那一行将被更改为以下内容。
if(val === null || val === undefined || val === '') {
例如,在我上面的例子中,将更新功能更改为以下功能将起作用(只要您正在使用我的fork或pull请求已获得批准)。
Note.update({_id: searchid}, body, {"emptyarrayallowed": true}, function(err, note) {
if (err) {
console.log(err);
} else {
console.log(note);
}
});
如果您对这个解决方案有任何疑问,请告诉我。
Charlie答案的小更新。正如Charlie所提到的,功能被合并了。但是,属性名称似乎已从emptyarrayallow重命名为allowEmptyArray。