代码没有得到更新以及如何知道迭代是否正在发生?

时间:2017-06-30 18:53:12

标签: node.js firebase firebase-realtime-database google-cloud-functions

我的firebase-database结构如下: firebase-database structure

我在node.js中的函数代码:

exports.addFunction = functions.database
    .ref('/Users/{uid}/GyroScope X-axis')
    .onWrite(event => {

var add = 0;
const addGyroX = admin.database().ref('/GyroXaddition');
const userRef = event.data.adminRef;  

userRef.once('value').then(snapshot => {
  snapshot.forEach(childrensnap => {
      var reading = childrensnap.key;
      var childData = reading.val();
      add = add+childData;
      return addGyroX.set(childData); 
    });
  });
});

我的计划是迭代GyroScope X轴的值,并在迭代时将值更新为新创建的路径(GyroXaddition)。我没有收到任何错误,但也没有更新。

2 个答案:

答案 0 :(得分:0)

您提供的代码肯定无法正常工作,可能会产生大量错误。这是我注意到的一些事情:

  1. 你没有归还你的承诺,这会给你带来麻烦。
  2. 您的forEach位置不正确,需要在函数体内调用。
  3. 您的set正在引用来自不同范围的数据(如果您尝试迭代多个值,.set将使用最后一个值)。
  4. event.data.adminRef是合适的大写字母。
  5. snapshot.key不是snapshot.key()
  6. 这个代码片段修复了一些的问题,但我不确定你要做什么才能让你一路走来。

    return userRef.once('value').then(snap => {
      var sets = [];
    
      snap.forEach(childsnapshot => {
        var reading = childsnapshot.key;
        var childData = reading.val();
      });
    });
    

答案 1 :(得分:0)

因为您没有等待异步调用返回值。抓取数据并设置childData时,需要的时间比平时长。使用异步编程时,多个线程将同时运行。在您的代码中,即使childData不存在,也会返回值addGyroX。因此,为了返回正确的值,请使用此代码

exports.addFunction =
functions.database .ref('/Users/{uid}/GyroScope X-axis') .onWrite(event => { 
  const addGyroX = admin.database().ref('/GyroXaddition'); 
  const userRef = event.data.adminref;
  userRef.once('value').then(forEach(childsnapshot => { 
    var reading = childsnapshot.key(); 
    var childData = reading.val(); 
    return addGyroX.set(childData);
  })
); 
});

这样,addGyroX只会在收到值时返回。