我正在建立一个计步器应用程序。
我有一个iOS应用程序将每天的总和推到/ users / {mobile} / steps / {date} /
更新或添加新步骤子项时,我想对该特定用户的所有步骤的值求和,并更新其stepsTotal
。
实现我需要的
如果有人能在这里提供一些帮助,我将不胜感激。 : - )
数据库
{
"users": {
"92291000": {
"firstName": "Tore",
"stepsTotal": "1500",
"steps": {
"02-09-2017": "500",
"03-09-2017": "1000"
},
import.js
var db = admin.database();
var dbRoot = db.ref("/");
var usersRef = dbRoot.child("users");
// This works
function saveUser(attributes) {
let mobile = attributes.mobile;
delete attributes['mobile']
let user = usersRef.child(mobile);
user.update(attributes);
}
function increaseSteps( { mobile=null, steps=null } = {}) {
// Find the User
console.log("looking for mobile", mobile); // OK
let userRef = usersRef.child(mobile);
// Here I'm not able to read the old data from the user.
userRef.transaction(function(user) {
console.log("user: ", user); // null
// ^ User is null.
});
/*
If I mangage to find user above, I expect to do something like this.
Or it is possible to only update *stepsTotal*?
*/
let attributes = {
firstName: user.firstName,
lastName: user.lastName,
stepsTotal: user.stepsTotal + steps,
}
user.update( attributes );
}
答案 0 :(得分:0)
如果我理解正确,您在代码片段中遇到问题:
let userRef = usersRef.child(mobile);
// Here I'm not able to read the old data from the user.
userRef.transaction(function(user) {
console.log("user: ", user); // null
// ^ User is null.
});
在Firebase数据库事务中,初始值通常为null
。来自Firebase documentation on transactions:
交易功能被多次调用
您的事务处理程序被多次调用,并且必须能够处理
null
数据。即使数据库中存在现有数据,也可能在运行事务函数时本地缓存它。
这是由于Firebase事务在幕后的工作原理。要了解有关详情,请参阅我的答案Transcation updateFunction parameter is null和Firebase runTransaction not working。
解决方案是处理这两种情况:如果用户节点尚不存在,则计算初始步数,否则更新步骤数:
let userRef = usersRef.child(mobile);
userRef.transaction(function(user) {
return (user || 0) + new_steps_for_user;
});