Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase:未处理的错误RangeError:超出最大调用堆栈大小_Javascript_Node.js_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript Firebase:未处理的错误RangeError:超出最大调用堆栈大小

Javascript Firebase:未处理的错误RangeError:超出最大调用堆栈大小,javascript,node.js,firebase,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Functions,当尝试在Firestore中为集合添加新项目(请求)时,尽管该项目已正确插入到集合中,但我遇到了一个无法理解的错误 更新 未处理的错误RangeError:超过最大调用堆栈大小 在isLength(/srv/node_modules/lodash/lodash.js:11739:22)处 键处的isArrayLike(/srv/node_modules/lodash/lodash.js:11359:31) (/srv/node_modules/lodash/lodash.js:13333:14)

当尝试在Firestore中为集合添加新项目(请求)时,尽管该项目已正确插入到集合中,但我遇到了一个无法理解的错误

更新

未处理的错误RangeError:超过最大调用堆栈大小 在isLength(/srv/node_modules/lodash/lodash.js:11739:22)处 键处的isArrayLike(/srv/node_modules/lodash/lodash.js:11359:31) (/srv/node_modules/lodash/lodash.js:13333:14)位于 /baseForOwn的srv/node_modules/lodash/lodash.js:4920:21 (/srv/node_modules/lodash/lodash.js:2990:24)位于Function.mapValues 编码处的(/srv/node_modules/lodash/lodash.js:13426:7) (/srv/node_modules/firebase functions/lib/providers/https.js:184:18) at/srv/node_modules/lodash/lodash.js:13427:38 at /srv/node_modules/lodash/lodash.js:4925:15在baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)

HTML

index.js(firebase函数)已更新*


此问题与此类似:
您不应直接返回调用firestore所产生的承诺,因为这是您的云功能的结果。这是因为DocumentReference不可序列化,因此不打算发回(错误消息来自lodash由于循环引用而无法序列化)

因此,为了发送可序列化的结果,您应该修改您的函数,如下所示:

exports.addRequest = functions.https.onCall((data, context) => {
  // ... 
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  }).then(doc => {
    return doc.id;
  });
});

这样,您的云函数现在将返回一个承诺,这样它就可以将其结果发送回您的客户端。

我尝试了您的代码,但它工作正常,无法复制。这是客户端错误还是服务器端错误?@Louiscowlet来自chrome控制台的错误:service.ts:160 POST 500正如所说,这一定是您发布的代码之外的错误。你在Firebase控制台>函数>日志中看到了什么想法吗?@LouisClolet是的,未处理的错误RangeError:最大调用堆栈大小超过了创建,这将问题缩小到index.js文件。你把它的全部内容都复制到这里了吗?此外,日志中没有其他指向调用堆栈的内容?感谢您的解释!我有一个额外的问题-你说在建议的解决方案之前代码在你这边工作,这是怎么回事?很高兴听到!我认为这可能是由于node或npm包版本的不同。使用初始代码、节点v12和当前包,Firebase能够序列化DocumentReference并将其发送回。我仍然建议使用上面的解决方案,因为这个对象看起来不适合序列化。
// add a new request
const requestForm = document.querySelector(".new-request form");
const requestModal = document.querySelector(".new-request");
requestForm.addEventListener("submit", (e) => {
  e.preventDefault();

  const addRequest = firebase.functions().httpsCallable("addRequest");
  addRequest({
    text: requestForm.request.value,
  })
  .then(() => {
    requestForm.reset();
    requestModal.classList.remove("open");
    requestForm.querySelector(".error").textContent = "";
  })
  .catch((error) => {
    requestForm.querySelector(".error").textContent = error.message;
  });
});
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

// auth trigger (user sign up)
exports.newUserSignup = functions.auth.user().onCreate((user) => {
  // for background triggers you must return a value/promise
  return admin.firestore().collection("users").doc(user.uid).set({
    email: user.email,
    upvotedOn: [],
  });
});

// auth trigger (user deleted)
exports.userDeleted = functions.auth.user().onDelete((user) => {
  // for background triggers you must return a value/promise
  const doc = admin.firestore().collection("users").doc(user.uid);
  return doc.delete();
});

// http callable function (adding a request)
exports.addRequest = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError(
      "unauthenticated",
      "only authenticated users can add requests"
    );
  }
  if (data.text.length > 30) {
    throw new functions.https.HttpsError(
      "invalid-argument",
      "request must be no more than 30 characters long"
    );
  }
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  });
});
exports.addRequest = functions.https.onCall((data, context) => {
  // ... 
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  }).then(doc => {
    return doc.id;
  });
});