我正在尝试使用Firebase Cloud函数来运行一些基于触发器的函数。
我的数据库看起来像这样
users{
userId{
dataSets{
dataSet1 { //data }
dataSet2 { //data }
}
weeklyTriggers {
dataSet1{
weekNo{
//updates
}
}
}
}
}
我正在使用onWrite
函数作为特定节点上的触发器:
exports.doSome = functions.database.ref('/users/{userId}/dataSets/{dataSetNo}').onWrite(
async (change, context) => {
const userId = context.params.userId;
const dataSetNo = context.params.dataSetNo;
const weekNo = getWeekNo(); //is a custom function works fine
var databaseRef = admin.database().ref('users');
databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).set({
data: 'Some Data'
});
});
我遇到的问题是,当我对dataSet1
进行更新时,它会设置该值,但是,当我为dataSet2
进行设置时,它将删除整个节点{{1 }},然后创建weeklyTriggers
如何确保不会删除weeklyTriggers/dataSet2/30/
?
编辑:
更新的代码
weeklyTriggers
答案 0 :(得分:1)
如果您在某个位置呼叫set()
,则该位置的所有数据将被您在呼叫中提供的数据替换。如果只想更新该位置下的某些属性,请使用update()
。
例如:
databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).update({
data: 'Some Data'
});
您可以提供指向update
的路径,以更深地更新JSON中的属性。因此,上述操作也可以通过以下方式完成:
databaseRef.update({
`${userId}/weeklyTriggers/${dataSetNo}/${weekNo}/data`: 'Some Data'
});
答案 1 :(得分:0)
Cloud函数应该返回一个Promise,否则可以在操作成功完成之前终止它,这可能会导致意外结果。尝试将return添加到set()操作中。
return databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).set({
data: 'Some Data'
});
或者您也可以添加await,但是在这种情况下,它非常无用