首页 > 解决方案 > 尝试将新变量推送到数组时“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"}');
 }


标签: node.jsfirebasefirebase-realtime-database

解决方案


这很可能是因为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


推荐阅读