«userIDs.push не является функцией» при попытке вставить новую переменную в массив - PullRequest
1 голос
/ 19 сентября 2019

Мне трудно понять, что я делаю не так.Я пришел из мира Android, где все намного проще ... во всяком случае, у меня есть функция, которая проверяет, существует ли таблица базы данных firebase, которую я хочу обновить, если она не создает ее.Пока все хорошо, проблема в том, что после создания таблицы я хочу обновить ее содержимое впоследствии, и у меня возникают проблемы с пониманием, почему я не могу обновить созданный мной массив.

вот мой код -

enter image description here

, как я уже сказал, у меня проблемы с передачей в мой массив.В журнале консоли Firebase я получаю следующую ошибку -

enter image description here

Насколько я знаю, массивы имеют метод .push.Так что же я делаю не так?

edit -

Вот как выглядит моя база данных.Очевидно, я держу 2 переменные, а не переменную и список, как я хотел бы.Я хочу, чтобы userUID были списком -

enter image description here

edit -

вот мой код -


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 ]

1 голос
/ 19 сентября 2019

Это наиболее вероятно, потому что 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

0 голосов
/ 20 сентября 2019

Хорошо, поэтому, увидев ответ Рено, я составил свой ответ из его ответа, потому что это было не совсем то, что мне было нужно.Поэтому я изменил свой метод '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}`);
    });
 }

работает как нужно - создает таблицус двумя объектами, один int, который самостоятельно увеличивается на вечность каждый раз, когда вызывается функция, а второй - массив, который добавляет profileUID в массив каждый раз, когда вызывается функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...