【发布时间】:2020-11-17 08:44:58
【问题描述】:
我正在尝试将我在表单中输入的数据设置为 Firebase 中的字段名称。
它在第 3 行 $("#blogUID").val()(博客/blogUID 集合)中运行良好。但是,当我尝试在 Stats/Blogs 集合(第 10 行)中设置字段名称时,出现以下错误:
error.ts:166 Uncaught FirebaseError: Function CollectionReference.doc() requires its first argument to be of type non-empty string, but it was: undefined
at new ui (https://www.gstatic.com/firebasejs/7.17.1/firebase-firestore.js:1:52471)
at Vh (https://www.gstatic.com/firebasejs/7.17.1/firebase-firestore.js:1:164122)
at kh (https://www.gstatic.com/firebasejs/7.17.1/firebase-firestore.js:1:163328)
at _d.doc (https://www.gstatic.com/firebasejs/7.17.1/firebase-firestore.js:1:280502)
at HTMLButtonElement.<anonymous> (http://localhost:8080/TeamSolheim_Page1.html:251:36)
at HTMLButtonElement.dispatch (https://code.jquery.com/jquery-3.5.1.min.js:2:43090)
at HTMLButtonElement.v.handle (https://code.jquery.com/jquery-3.5.1.min.js:2:41074)
1 $("#blog-submit-button").click(function(){
2 // Add a new document in collection
3 // db.collection("Blogs").doc($("#blogUID").val()).set({
4 // blogDate: $("#blogDate").val(),
5 // blogLink: $("#blogLink").val(),
6 // blogTitle: $("#blogTitle").val(),
7 // })
8 // .then(function() {
9 db.collection("Stats").doc($("Blogs").val()).set({
10 $("#blogUID").val(): $("#blogLikes").val(),
11 })
12 .then(function() {
console.log("Document successfully written!");
$("#blog-form").hide();
$("#create-form").show();
})
.catch(function(error) {
console.error("Error writing document 2: ", error);
});
// })
// .catch(function(error) {
// console.error("Error writing document 1: ", error);
// });
})
权限对任何经过身份验证的用户开放:
match /Stats/Blogs {
allow read;
allow write: if request.auth != null;
}
我尝试过的事情:
var _temp = $("#blogUID").val();
console.log(_temp);
db.collection("Stats").doc("Blogs").set($("#blogUID").val, 123)
//db.collection("Stats").doc("Blogs").val().set({
//_temp: $("#blogLikes").val(),
//"$$_temp.val()": $("#blogLikes").val(),
//$$_temp: $("#blogLikes").val(),
//window['_temp']: $("#blogLikes").val(),
//$("#blogUID").val: $("#blogLikes").val(),
//_temp: $("#blogLikes").val(),
//'$("#blogUID").val()': $("#blogLikes").val(),
//doc.$("#blogUID"): $("#blogLikes").val(),
//$("#blogUID").val(): $("#blogLikes").val(),
// })
这是繁荣的最终代码......
$("#blog-submit-button").click(function(){
// Add a new document in collection
db.collection("Blogs").doc($("#blogUID").val()).set({
blogDate: $("#blogDate").val(),
blogLink: $("#blogLink").val(),
blogTitle: $("#blogTitle").val(),
})
.then(function() {
var _temp = $("#blogUID").val();
console.log(_temp);
db.collection("Stats").doc("Blogs").set({
[_temp]: $("#blogLikes").val()
})
.then(function() {
console.log("Document successfully written!");
$("#blog-form").hide();
$("#create-form").show();
})
.catch(function(error) {
console.error("Error writing document 2: ", error);
});
})
.catch(function(error) {
console.error("Error writing document 1: ", error);
});
})
【问题讨论】:
-
错误函数很清楚 - .doc() 的参数未定义 - 您的第 9 行显示 .doc($("Blogs").val) - $("Blogs") 没有从这里看起来像一个有效的 jsquery 选择器。您的第 3 行显示 .doc($("#blogUID")),其中 $("#blogUID") 看起来像是 ID 为“blogUID”的元素的有效 jsquery 选择器。
-
这有帮助,我将第 9 行更改为 'db.collection("Stats").doc("Blogs").set({' 并且我不再收到错误消息。我仍然没有在第 10 行没有得到想要的结果。它只是将“#blogID”写入数据库,而不是我存储在变量中的实际值。
-
我认为您没有正确指定 set 对象 - 我认为您打算写 { [$("#blogUID").val()]: $ ("#blogLikes").val()} 使用 ID 为 #blogUID 的 jQuery 搜索的 HTML 元素的值作为字段名称? Set 期待一个普通的对象。
-
作为一个 style 问题,将 jQuery HTML 元素混合到 Firestore 命令中读入不太可能是有效的,并且 very 可能会导致错误,因为它们对几个相似的字符都有完全不同的解释。将表单元素读入局部变量,并在 Firestore 调用中使用这些元素来保持职责分离。
-
我已经试过了,我只是想不出正确的语法。我已在原始帖子中添加了“我尝试过的事情”部分。
标签: javascript html firebase google-cloud-firestore