首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防火墙:未处理错误RangeError:超过最大调用堆栈大小

防火墙:未处理错误RangeError:超过最大调用堆栈大小
EN

Stack Overflow用户
提问于 2020-10-13 11:19:07
回答 1查看 869关注 0票数 1

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

已更新

未处理错误RangeError:在isArrayLike (/srv/node_ isLength /isLength/srv/node_isLength/ baseForOwn (/srv/node_isLength/baseForOwn:4920:21 at baseForOwn)(/srv/node_isLength/baseForOwn//srv/node_isLength/baseForOwn//srv/node_baseForOwn/isArrayLike/baseForOwn:2990:24)超过的最大调用堆栈大小(/srv/node_isLength/isLength:11739:22)。38:13426:7)(编码为(/srv/node_modules/firebase-functions/lib/providers/https.js:184:18) at /srv/node_node/flash.js:13427:38 at /srv/node_node/ baseForOwn :4925:15 at baseForOwn(/srv/node_baseForOwn/loash.js:2990:24)

HTML

代码语言:javascript
运行
复制
<!-- new request modal -->
  <div class="new-request">
    <div class="modal">
      <h2>New request</h2>
      <form>
        <input type="text" name="request" placeholder="request...">
        <button>Add</button>
        <p class="error"></p>
      </form>
    </div>
  </div>

app.js

代码语言:javascript
运行
复制
// 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;
  });
});

更新的index.js (火基函数)*

代码语言:javascript
运行
复制
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,
  });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-14 21:59:27

这个问题类似于这个问题:https://stackoverflow.com/a/52569728/6016470

您不应该作为云函数的结果直接返回您对防火墙的调用所产生的承诺。这是因为DocumentReference并不打算返回,因为它是不可序列化的(您的错误消息来自由于循环引用而未能序列化)。

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

代码语言:javascript
运行
复制
exports.addRequest = functions.https.onCall((data, context) => {
  // ... 
  return admin.firestore().collection("requests").add({
    text: data.text,
    upvotes: 0,
  }).then(doc => {
    return doc.id;
  });
});

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64334220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档