node.js - 尝试将新变量推送到数组时“userIDs.push 不是函数”
问题描述
我很难理解我做错了什么。我来自 Android 世界,一切都变得如此简单......无论如何,我有一个函数可以检查我要更新的 firebase 数据库表是否存在,如果不存在,它会创建一个。到目前为止一切都很好,问题是在创建表之后我想更新它的内容并且我在理解为什么我不能更新我创建的数组时遇到了问题。
这是我的代码-
正如我所说,我在推送到我的阵列时遇到了问题。在 firebase 控制台日志中,我收到以下错误 -
据我所知,数组有“.push”方法。那么我做错了什么?
编辑 -
这是我的数据库的样子。显然,我持有 2 个变量,而不是我想要的变量和列表。我希望 userUIDs 是一个列表 -
编辑 -
这是我的代码-
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"}');
}
解决方案
这很可能是因为deletedVideosVar["usersUIDs"]
不是数组。
通过这样做deletedVideosVar["usersUIDs"]
,您正在使用方括号表示法访问对象的usersUIDs
属性,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessorsdeletedVideosVar
正如实时数据库文档中所解释的,“根据 a 中的数据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
推荐阅读
- javascript - 如何使 2 个函数 onclick 在 JS 中工作?
- css - 显示`的内容`当`
` 已关闭
- database - 包含有关数据库信息的 Sqlite 显示表
- c - 在c中使用函数计算水费
- python - 如何在 xlwings 中导入混淆的 python 脚本
- python - Pandas datfaframe,如何对按其他 2 列分组的列进行排序
- laravel - 未找到 Laravel 地平线类“Combindma\YotpoApi\Facades\YotpoApi”
- python - Kivy 使用来自另一个屏幕的条目更新 TextInput 字段
- lambda - 无法在 Serverless .net core web api 中映射 POST API 的请求参数
- html - 如何在横幅底部放置 2 个按钮?