我很难理解我在做什么。我来自Android世界,那里的一切都非常简单...无论如何,我有一个函数可以检查我要更新的firebase数据库表是否存在,如果没有,它会创建一个。到目前为止,问题是创建表后我想在之后更新它的内容,并且在理解为什么无法更新创建的数组时遇到问题。
这是我的代码-
正如我所说,我在推送到数组时遇到了问题。在Firebase控制台日志中,出现以下错误-
据我所知,数组具有'.push'方法。那我做错了什么呢?
编辑-
这是我的数据库的外观。显然,我持有2个变量,而不是我想要的一个变量和一个列表。我希望userUID成为列表-
编辑-
这是我的代码-
function createOrUpdateDeletedVideosTable(profileUid, response) {
const deletedVideosRef = database.ref(config.ENTITY_NAME_DELETED_VIDEOS);
return deletedVideosRef.once("value").then(deletedVideosSnapshot => {
var snapshotValue = JSON.stringify(deletedVideosSnapshot);
console.log("snapshot value is null - " + snapshotValue !== "null")
console.log("snapshot value is null - " + snapshotValue !== null)
if (snapshotValue !== "null") {
console.log("deleted videos ref exists - " + JSON.stringify(deletedVideosSnapshot));
var deletedVideosVar = deletedVideosSnapshot.val();
console.log(JSON.stringify(deletedVideosVar))
deletedVideosVar["totalVideosDeleted"] = deletedVideosVar.totalVideosDeleted += 1
deletedVideosVar.userUIDs.push(profileUid);
deletedVideosRef.set(deletedVideosVar);
return response.status(200).send('{"result": "OK"}');
}
console.log("deleted videos ref does not exist")
return createDeletedVideosTable(profileUid, response);
}).catch(err => {
console.log(err);
return response.status(500).send(`deleted video counter error - ${err}`);
});
}
function createDeletedVideosTable(profileId, response) {
var deletedVideosVar = {
totalVideosDeleted : 1,
userUIDs : {
profileId
}
};
// deletedVideosVar.totalVideosDeleted = 1
// deletedVideosVar.userUIDs.push(profileId);
database.ref(config.ENTITY_NAME_DELETED_VIDEOS).set(deletedVideosVar);
return response.status(200).send('{"result": "OK"}');
}
答案 0 :(得分:1)
这很可能是因为deletedVideosVar["usersUIDs"]
不是数组。
通过执行deletedVideosVar["usersUIDs"]
,您将使用方括号表示法访问usersUIDs
对象的deletedVideosVar
属性,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors
如实时数据库doc中所述,“取决于DataSnapshot
中的数据,val()
方法可能返回标量类型(字符串,数字或布尔值),数组或对象”。
如果您共享数据库的结构,我们可以确认deletedVideosVar["usersUIDs"]
不是数组的假设。
在评论后更新:
以下代码将更新一个实时数据库节点,该节点是一个具有新值的数组。请注意,对于实时数据库,您需要首先读取现有数组,然后推送一个值并重新写入整个数组。
var db = firebase.database();
var myRef = db.ref('myRef');
myRef.once('value').then(function(snapshot) {
//Let's create a random value for this example
var random = Math.floor(Math.random() * 500 + 1);
if (snapshot.exists()) {
var newArray = snapshot.val().array;
newArray.push('A' + random);
var postData = {
array: newArray
};
var updates = {};
updates['myRef'] = postData;
db.ref().update(updates);
} else {
var postData = {
array: ['A' + random]
};
myRef.set(postData);
}
});
对于deletedVideosVar.totalVideosDeleted
的增量,您可能应该使用事务,请参见https://firebase.google.com/docs/database/web/read-and-write?authuser=0#save_data_as_transactions
答案 1 :(得分:0)
好的,所以在看到Renaud的答案之后,我就从他的答案中得出了答案,因为这并不是我真正需要的。所以我将'createDeletedVideosTable'方法更改为以下代码-
function createDeletedVideosTable(profileId, response) {
console.log("No video deletion table available, creating a new one");
const deletedVideosVar = {};
deletedVideosVar['totalVideosDeleted'] = 1;
deletedVideosVar['userIDs'] = [profileId];
database.ref(config.ENTITY_NAME_DELETED_VIDEOS).set(deletedVideosVar);
re
,然后将我的createOrUpdateDeletedVideosTable
方法更改为以下内容-
function createOrUpdateDeletedVideosTable(profileUid, response) {
const deletedVideosRef = database.ref(config.ENTITY_NAME_DELETED_VIDEOS);
return deletedVideosRef.once("value").then(deletedVideosSnapshot => {
const snapshotValue = JSON.stringify(deletedVideosSnapshot);
if (snapshotValue !== "null") {
const deletedVideosVar = deletedVideosSnapshot.val();
console.log(JSON.stringify("Deleted videos table before deletion - " + deletedVideosVar))
deletedVideosVar.totalVideosDeleted += 1;
deletedVideosVar.userIDs.push(profileUid);
deletedVideosRef.set(deletedVideosVar);
console.log("Successfully added a video to deleted videos table")
return response.status(200).send('{"result": "OK"}');
}
return createDeletedVideosTable(profileUid, response);
}).catch(err => {
console.log(err);
return response.status(500).send(`deleted video counter error - ${err}`);
});
}
根据需要工作-创建一个包含2个对象的表,一个int每次调用该函数时self永久递增,第二个int是一个数组,该数组每次调用该函数时都会向该数组添加profileUID。