尝试将新变量推送到数组时出现“ userIDs.push不是函数”

时间:2019-09-19 17:42:28

标签: node.js firebase firebase-realtime-database

我很难理解我在做什么。我来自Android世界,那里的一切都非常简单...无论如何,我有一个函数可以检查我要更新的firebase数据库表是否存在,如果没有,它会创建一个。到目前为止,问题是创建表后我想在之后更新它的内容,并且在理解为什么无法更新创建的数组时遇到问题。

这是我的代码-

enter image description here

正如我所说,我在推送到数组时遇到了问题。在Firebase控制台日志中,出现以下错误-

enter image description here

据我所知,数组具有'.push'方法。那我做错了什么呢?

编辑-

这是我的数据库的外观。显然,我持有2个变量,而不是我想要的一个变量和一个列表。我希望userUID成为列表-

enter image description here

编辑-

这是我的代码-


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"}');
 }


2 个答案:

答案 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。