firebase 功能内部服务器和最大 sta
firebase functions internal server and maximum sta
我的目标是如果用户通过身份验证并且输入的长度小于 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
});
}
})
可调用函数不应该 return 任何承诺。他们应该 return 一个通过发送给客户端的响应来解决的承诺。你的是 returning 一个在数据库操作完成时解析的承诺。请注意,add() return 是一个 DocumentReference 对象。 nodejs 无法序列化此对象,因为它包含 self-referential 个链接。您需要准确决定客户应该收到什么。
您可以通过 return 更具体的内容在短期内解决此问题:
return admin.firestore().collection("requests").add({
text :data.text,
upVote : 0
})
.then(() => {
return { result: "OK" }
})
但最终,您需要定义和实施客户端需要接收的内容。
另请参阅:
- Firebase Unhandled error RangeError: Maximum call stack size exceeded
我的目标是如果用户通过身份验证并且输入的长度小于 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
});
}
})
可调用函数不应该 return 任何承诺。他们应该 return 一个通过发送给客户端的响应来解决的承诺。你的是 returning 一个在数据库操作完成时解析的承诺。请注意,add() return 是一个 DocumentReference 对象。 nodejs 无法序列化此对象,因为它包含 self-referential 个链接。您需要准确决定客户应该收到什么。
您可以通过 return 更具体的内容在短期内解决此问题:
return admin.firestore().collection("requests").add({
text :data.text,
upVote : 0
})
.then(() => {
return { result: "OK" }
})
但最终,您需要定义和实施客户端需要接收的内容。
另请参阅:
- Firebase Unhandled error RangeError: Maximum call stack size exceeded