Как клонировать узел в другой путь на основе ссылочного значения из начального пути в облачных функциях Google? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь клонировать данные «оригинального» узла (как только я создаю данные) в путь, основанный на пути исходного узла.

Это моя структура данных:

root: { 
  doors: {
    111111111111: {
       MACaddress: "111111111111",
       inRoom: "-LBMH_8KHf_N9CvLqhzU", // I will need this value for the clone's path
       ins: {
          // I am creating several "key: pair"s here, something like:
          1525104151100: true,
          1525104151183: true,
       }
    }
  },
  rooms: {
    -LBMH_8KHf_N9CvLqhzU: {
      ins: {
        // I want the function to clone the same data here:
        1525104151100: true,
        1525104151183: true,
      }
    }
  }

Моя облачная функция теперь выглядит так:

exports.updateRoom = functions.database.ref('/doors/{MACaddress}/ins').onWrite((change, context) => {
    const beforeData = change.before.val(); // data before the write
    const afterData = change.after.val(); // data after the write
    const roomPushKey = change.before.ref.parent.child('/inRoom');
    console.log(roomPushKey); // this is retrieving all the info about the ref "inRoom" but not its value... 

Вопрос 1) Как я могу получить значение этого ref / узла?

Мой код продолжается, пытаясь получить значение, подобное этому.

    roomPushKey.once('child_added').then(function(dataSnapshot) {
        let snapVal = dataSnapshot.val();
        console.log(snapVal);
});

Вопрос 2 (который, я думаю, в основном перефразирован в вопросе 1): Как я могу получить snapVal за пределами затем. область действия метода?

    return change.after.ref.parent.parent.parent.child('/rooms')
.child(snapVal).child('/ins').set(afterData);
      // snapVal should go above
   });

Сообщение об ошибке: ReferenceError: snapVal не определено

1 Ответ

0 голосов
/ 02 мая 2018

Должно работать следующее.

const admin = require("firebase-admin");
....
....

exports.updateRoom = functions.database.ref('/doors/{MACaddress}').onWrite((change, context) => {
    const afterData = change.after.val(); // data after the write

    const roomPushKey = afterData.inRoom;
    const ins = afterData.ins;

    const updates = {};
    updates['/rooms/' + roomPushKey] = ins;
    return admin.database().ref().update(updates);

}).catch(error => {
    console.log(error);
    //+ other rerror treatment if necessary

});

Вот некоторые объяснения:

Вы получите roomPushKey, прочитав «данные после записи» как объект: roomPushKey = afterData.inRoom. Вам не нужно делать roomPushKey.once('child_added').then()

Получив roomPushKey, вы создаете новый дочерний узел в узле rooms, используя update() и создавая объект с нотацией в квадратных скобках, который позволяет вам назначить идентификатор узла (то есть roomPushKey) ,

Обратите внимание, что вы также можете сделать:

return admin.database().ref('/rooms/' + roomPushKey).set(ins);

Обратите внимание, что вам нужно импортировать firebase-admin, чтобы иметь возможность вернуть admin.database().ref()...

Наконец, я бы посоветовал вам взглянуть на три следующих видео от команды Firebase: youtube.com / watch? V = 7IkUgCLr5oA & t = 517s & youtube.com / watch? v = 652XeeKNHSk & t = 27s & youtube.com / watch? v = d9GrysWH1Lc . Обязательным для любого, кто начинает кодирование для облачных функций.

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