【问题标题】:How to set a variable value to Field name in Firebase Cloud. Web/HTML如何在 Firebase Cloud 中将变量值设置为字段名称。网页/HTML
【发布时间】: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


【解决方案1】:

向下移动到格式化的答案:

.set() 需要一个对象 - 你在第一次尝试时就“更接近”了它。试试这个:

const blogger = $("#blogUID").val() // jQuery
const bloggerLikes = $("#blogLikes").val() // jQuery

db.collection("Stats").doc("Blogs").set( { [ blogger]:  bloggerLikes } )

需要 [ ] 使用 blogger 值作为索引/字段名

【讨论】:

    【解决方案2】:

    根据@LeadDreamer 评论将其发布为社区 Wiki。

    从堆栈跟踪看来,您的错误与您尝试在第 9 行查询文档的方式有关。从第 3 行开始,db.collection("Blogs").doc($("#blogUID").val()).set() 正在从blogUID 正确搜索,其中查询基于id 似乎是有效的。

    但是,在您的第 9 行中,此 db.collection("Stats").doc($("Blogs").val()).set() 没有返回基于 id 的查询,因为您可以注意到 .doc() 函数中 #blogUIDBlogs 之间的区别。由于错误提示问题在于 .doc() 未定义,请更改您在第 9 行调用的方式,以遵循第 3 行的相同模式。

    【讨论】:

    • 首先,在这两种情况下,都是写入数据(使用set命令)。
    • 其次,这是我尝试保存数据的位置的问题。在第 3 行,我保存到 \Blogs\BlogID\blogDate\blogDate。在第 10 行,我保存到 \Stats\Blogs\BlogID\blogLikes。使用这些术语 Collection\Document\Field\Data 存储数据。在第三行,它可以很好地保存到文档名称,但是,在第 10 行,它无法保存到字段名称。它有数据,为什么称它为“非空”字符串??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多