当试图在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
<!-- 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
// 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 (火基函数)*
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,
});
});
发布于 2020-10-14 13:59:27
这个问题类似于这个问题:https://stackoverflow.com/a/52569728/6016470
您不应该作为云函数的结果直接返回您对防火墙的调用所产生的承诺。这是因为DocumentReference并不打算返回,因为它是不可序列化的(您的错误消息来自由于循环引用而未能序列化)。
因此,为了发送可序列化的结果,您应该按如下方式修改您的函数:
exports.addRequest = functions.https.onCall((data, context) => {
// ...
return admin.firestore().collection("requests").add({
text: data.text,
upvotes: 0,
}).then(doc => {
return doc.id;
});
});
这样,云函数现在返回一个承诺,这样它就可以将其结果发送给您的客户端。
https://stackoverflow.com/questions/64334220
复制