【问题标题】:Firebase transaction in nodeJsnodeJs中的Firebase事务
【发布时间】:2018-06-30 19:33:54
【问题描述】:

我试图实现的只是通过事务增加数据库中的值。这按预期对我有用,但我的 firebase 控制台中总是出现以下错误:

Function returned undefined, expected Promise or value

我目前的电话如下:

exports.reportCounter = functions.database.ref('/user/{userId}/reports/{initiatorId}').onWrite((change,context) => {
const userId = context.params.userId;

return userRef.child(userId).child("numReports").transaction(function(numReports) {
    return change.after.exists()?((numReports || 0) + 1):(numReports - 1);
})
});

我也尝试过直接返回承诺:

return userRef.child(userId).child("numToIncrement").transaction(function(numToIncrement) {
            return ((numToIncrement || 0) + 1);
 });

在这两种情况下,代码都在做它应该做的事情,但我仍然收到上述错误。

【问题讨论】:

  • 你应该可以直接返回promise。请编辑您的问题以在您尝试时显示整个代码示例。
  • 我编辑了我的帖子。当我尝试直接返回承诺时,我实际上得到了另一个错误,但这似乎有所不同。
  • “似乎有所不同”是什么意思?
  • 有时会收到“函数返回未定义,预期的 Promise 或值”,有时会收到“错误序列化返回值:TypeError:将循环结构转换为 JSON”

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


【解决方案1】:

这就是你应该如何实现事务,这样函数总是返回一个承诺:

exports.reportCounter = functions.database.ref('/user/{userId}/reports/{initiatorId}').onWrite((change, context) => {
  const userId = context.params.userId;
  let increment;
  if (change.after.exists() && !change.before.exists()) {
    increment = 1;
  } else if (!change.after.exists() && change.before.exists()) {
    increment = -1;
  }
  return userRef.child(userId).child("numReports").transaction(function(numReports) {
    return (numReports || 0) + increment;
  })
});

【讨论】:

  • 我仍然收到“错误序列化返回值:TypeError:将循环结构转换为 JSON”。我想这与事实有关,即在 Firebase 中多次调用事务。
猜你喜欢
  • 2019-06-27
  • 2013-04-13
  • 2017-01-17
  • 2013-04-14
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
相关资源
最近更新 更多