Firebase Cloud函数“超出最大调用堆栈大小”[重复]

vc9ivgsu  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(98)

此问题在此处已有答案

Firebase Unhandled error RangeError: Maximum call stack size exceeded(3个答案)
昨天关门了。
这是我的firebase云函数。当用户点击我的iOS应用程序中的按钮时,它会增加一个计数器。该函数当前运行,但我收到错误“Unhandled error RangeError:在编码”“处超出了最大调用堆栈大小。在viewDidLoad(按下按钮后的目标视图)中调用了该函数。

exports.categoryOpened = functions.https.onCall((data, context) => {
  const categoryUUID = data.categoryUUID;
  const countryCode = data.countryCode;

  // Get the current date and hour
  const date = new Date();
  const dd = String(date.getDate()).padStart(2, "0");
  const mm = String(date.getMonth() + 1).padStart(2, "0");
  const yyyy = date.getFullYear();
  const hour = date.getHours();

  const path = "analytics/"+
    countryCode +
    "/categories/" +
    categoryUUID +
    "/categoryOpened/" +
    dd + "-" + mm + "-" + yyyy +
    "/" + hour;

  // Increment the count at the appropriate location in the database
  return admin.database(analyticsDb).ref(path).transaction((count) => {
    if (count) {
      return count + 1;
    }
    return 1;
  });
});
k3bvogb1

k3bvogb11#

正如@GabrielNexT的评论所强调的,这是一个与其他answer thread类似的问题。
DatabaseReference#transaction()调用返回一个Promise<TransactionResult>,其中包含一个嵌套的DataSnapshot对象,该对象最终是错误的实际原因。
要正确地展开它并使用事务返回新计数,您将使用以下命令(可能需要多次尝试):

// Increment the count at the appropriate location in the database
return admin.database(analyticsDb)
  .ref(path)
  .transaction(count => (count || 0) + 1) // concise form of your code
  .then(transactionResult => transactionResult.snapshot.val()) // return the new value

或者,以下代码也可用于跳过使用事务(单次尝试):

const counterRef = admin.database(analyticsDb).ref(path);

return counterRef.set(admin.database.ServerValue.increment(1)) // bumps counter by 1, handled by RTDB server
  .then(() => counterRef.get()) // gets the latest new value
  .then((counterSnapshot) => counterSnapshot.val()) // returns the new value

相关问题