交易有效,但抛出错误

时间:2017-07-04 17:02:10

标签: javascript firebase firebase-realtime-database google-cloud-functions

我的应用程序中有一个用例,我需要在数据库中的两个节点上执行更新,其中执行的更新本身取决于从这两个节点读取的数据。我写的代码确实对数据库产生了预期的效果,但日志包含错误:

Error serializing return value: TypeError: Converting circular structure to JSON

以下是重现错误所需的一些最小代码。如果数据库最初在路径“b”和“c”处有数字条目,然后在“a”处写入新值,则下面的代码将更新b和c,但会在日志中报告上述错误。

exports.bork = functions.database.ref("a").onWrite(event => {
  return Promise.all([
    admin.database().ref("b").once("value"),
    admin.database().ref("c").once("value")
]).then(snapshots => {
  var left = snapshots[0].val();
  var right = snapshots[1].val();
  var average = (left + right) / 2;
  return Promise.all([
    admin.database().ref("b").transaction(
      data => { return data + average; }
    ),
    admin.database().ref("c").transaction(
      data => { return data + average; }
    )
  ]);
});
}
);

我很确定导致这种情况的原因。它似乎只是在我阅读它后在节点上进行交易时发生,但我不明白为什么这应该是一个问题。有没有办法执行此更新以避免此错误?

编辑:根据要求,我尽可能地删除了上面的例子。它仍会产生相同的错误。

exports.bork = functions.database.ref("a").onWrite(event => {
  return admin.database().ref("b").once("value")
  .then(snapshots => {
    return admin.database().ref("b").transaction(
        data => { return data; }
      );
  });
});

另一方面,以下代码在网页中正常工作。

Promise.all([
      database.ref("b").once("value"),
      database.ref("c").once("value")
    ]).then(snapshots => {
      console.log("Acquired snapshots.");
      var left = snapshots[0].val();
      var right = snapshots[1].val();
      var average = (left + right) / 2;
      return database.ref("b").transaction(
        data => { return data + average; }
      );
    }).then( result=>{console.log(result)}, error=>{console.log(error)} )

0 个答案:

没有答案