【问题标题】:firebase functions internal server and maximum stafirebase 功能内部服务器和最大 sta
【发布时间】:2021-02-03 00:10:45
【问题描述】:

如果用户通过身份验证并且输入的长度小于 30,我的目标是从用户那里获取输入并将其存储到基础中,然后清除输入并关闭表单。它在后端存储数据但也抛出此错误。

这是 firebase 日志中的错误

Unhandled error RangeError: Maximum call stack size exceeded
    at Object (native)
    at /srv/node_modules/lodash/lodash.js:4919:24
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)
    at Function.mapValues (/srv/node_modules/lodash/lodash.js:13426:7)
    at encode (/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
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)
    at Function.mapValues (/srv/node_modules/lodash/lodash.js:13426:7)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:184:18)

以状态码 500 结束

这是它在浏览器中显示的错误

Error: INTERNAL
    at new g (error.ts:66)
    at b (error.ts:175)
    at A.<anonymous> (service.ts:263)
    at tslib.es6.js:100
    at Object.next (tslib.es6.js:81)
    at r (tslib.es6.js:71)

这是 html 的代码:

<!-- new request modal -->
  <div class="new-request">
    <div class="modal">
      <h2>Request a Tutorial</h2>
      <form method="GET" action="#">
        <input type="text" name="request" placeholder="Request...">
        <button type="submit">Submit Request</button>
        <p class="error"></p>
      </form>
    </div>
  </div>

这是用于 JS 事件监听器的

// Add a 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((err) => {
    console.log(err);
    requestForm.querySelector(".error").textContent = err.message;
  })

});

最后,这是 firebase 函数

// http callable function (adding a request)
exports.addRequest = functions.https.onCall((data,context) => {
    if (!context.auth) {
        throw new functions.https.HttpsError('unauthenticated',"Unauthorized Person not allowed!");
    }
    else if (data.text.length > 30) {
        throw new functions.https.HttpsError('invalid-argument',"Length of string must be less than 30");
    }

    else {
            return admin.firestore().collection("requests").add({
                text :data.text,
                upVote : 0
            }); 
    }
})

【问题讨论】:

  • 调用云函数后好像出错了。你能解释一下回调应该如何工作吗?
  • 我正在从 youtube 频道 netninja 学习 firebase,我所做的和他完全一样,但他的代码运行顺利,我的代码出现了这个错误,但我已经解决了,谢谢你的评论

标签: javascript firebase google-cloud-functions http-status-code-500


【解决方案1】:

可调用函数不应该只返回任何承诺。他们应该返回一个承诺,该承诺通过发送给客户端的响应来解决。你的返回一个承诺,当数据库操作完成时解决。请注意,add() 返回一个 DocumentReference 对象。 nodejs 无法序列化此对象,因为它包含自引用链接。您需要准确决定客户应该收到什么。

您可以通过返回更具体的内容在短期内解决此问题:

return admin.firestore().collection("requests").add({
    text :data.text,
    upVote : 0
})
.then(() => {
    return { result: "OK" }
})

但最终,您需要定义和实现客户端需要接收的内容。

另见:

【讨论】:

  • 如果您发现此答案有帮助,Stack Overflow 上的习惯做法是对答案进行投票并使用答案左侧的按钮将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
相关资源
最近更新 更多