【问题标题】:Code not getting updated and how to know whether iteration is happening?代码没有更新,如何知道迭代是否正在发生?
【发布时间】:2017-07-01 06:13:27
【问题描述】:

我的 firebase-database 结构如下:

还有我在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)。我没有收到任何错误,但它也没有更新。

【问题讨论】:

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


    【解决方案1】:

    您提供的代码肯定不会工作,并且可能会引发很多错误。以下是我注意到的一些事情:

    1. 你没有返回你的 Promise,这会给你带来麻烦。
    2. 您的forEach 不在位,需要在函数体内调用。
    3. 您的 set 正在引用来自不同范围的数据(如果您尝试迭代多个值,.set 将只使用最后一个值)。
    4. event.data.adminRef 是正确的大写形式。
    5. snapshot.key 不是 snapshot.key()

    这个 sn-p 解决了一些的问题,但我不确定你想做什么才能让你一直到那里。

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

    【讨论】:

    • 他实际上并没有Promise,所以他可以正常返回。
    • 谢谢,但在部署代码时它没有抛出任何错误。那我怎么知道有没有错误,我用的是VS代码编辑器。而且我已经根据您的建议对代码进行了更改,但仍然无法正常工作。我的计划是只遍历它下面的 GyroScope X 轴值并添加第一次迭代(图 0.004...555)和第二次迭代(0.002...645)中的值并将结果更新到不同的路径如果存在或创建路径并设置结果。
    • 你能告诉我更新的代码有什么问题吗?如果可能的话,我从一天半以来一直在努力解决这个问题?
    【解决方案2】:

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

    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 只会在收到值时返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2015-02-23
      相关资源
      最近更新 更多