Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从一个firestore文档检索数据以查询另一个firestore文档_Javascript_Google Cloud Firestore - Fatal编程技术网

Javascript 从一个firestore文档检索数据以查询另一个firestore文档

Javascript 从一个firestore文档检索数据以查询另一个firestore文档,javascript,google-cloud-firestore,Javascript,Google Cloud Firestore,我在Firestore收藏中有2个文档 我想查询一个文档以获取用户的车牌号,并使用该车牌号检索存储在另一个文档中的车辆数据 这是我的代码: function get_full_name_by_nplate(nplate){ var docRef = global_db.collection("customer_data").doc('web-app-vehicle-data'); docRef.get().then(function(doc) {

我在Firestore收藏中有2个文档

我想查询一个文档以获取用户的车牌号,并使用该车牌号检索存储在另一个文档中的车辆数据

这是我的代码:

function get_full_name_by_nplate(nplate){
    var docRef = global_db.collection("customer_data").doc('web-app-vehicle-data');
    docRef.get().then(function(doc) {
        var data = doc.data();
        given_name = data["vehicles"][nplate]["policy_holder_given_name"];
        family_name = data["vehicles"][nplate]["policy_holder_family_name"];
    
        console.log("given name: " + given_name); //this prints correctly! ==> "Jaime"
    
        return given_name + " " + family_name;//this returns undefined
    });
}

//load user data ////driving scores from backend
function loadUserData(user){
    var nplate_list;

    var docRef = global_db.collection("customer_data").doc('web-app-user-data');
    docRef.get().then(function(doc) {
        var data = doc.data();
        user_data = data["users"][user.email];
        nplate_list = user_data["number_plates"];
    
    }).then(function(){

        for(nplate of nplate_list){
        
            get_full_name_by_nplate(nplate).then(full_name => {
                console.log(full_name);//this prints undefined
            });
        }
    });
}
我已经阅读了这个答案,我知道Firestore会返回承诺,所以我必须始终使用
。然后在Firestore数据检索后使用

虽然我能够将正确的
给定的\u名称
打印到控制台,但函数
函数get\u full\u name\u by \u nplate
返回
未定义的

也许不起作用的是,我将一个承诺嵌套在另一个承诺中,但我不知道嵌套它们是否是错误的,也不知道不嵌套如何做

更新

通过@kvetis的回答,我改进了代码,现在它可以工作了。但是它仍然感觉不对,我不得不将
nplate\u list
作为参数从一个
传递到下一个
。。我不想想象如果我必须传递它5次,而且我仍然嵌套2个
.then()
语句,这也感觉不自然

//load user data ////driving scores from backend
function loadUserData(user){



var docRef = global_db.collection("customer_data").doc('web-app-user-data');
    docRef.get().then(function(doc) {
        var data = doc.data();

        global_user_data = data["users"][user.email];
        //console.log(global_user_data["number_plates"]);

        var user_name  = global_user_data["name"] + " " + global_user_data["surname"];
        document.getElementById("welcome_div").innerHTML = user_name;

        var nplate_list = global_user_data["number_plates"];
        
        console.log("these are the nplates: " + nplate_list);
        
        return nplate_list;
    })
    
    .then(function (nplate_list) {
        var docRef = global_db
            .collection("customer_data")
            .doc("web-app-vehicle-data");
        
        docRef.get().then(function(doc) {
            global_vehicle_data = doc.data()["vehicles"];
            
            var cust_dropdown = document.getElementById("cust-search-dropdown");
            dropdown_content = "";
            
            for(nplate of nplate_list){
                //console.log(nplate);
                var full_name = get_full_name_by_nplate(global_vehicle_data, nplate);
                dropdown_content += "<div class=\"cust-dropdown-items\"><a href=\"#\" id=\"" + nplate + "\" class=\"number-plate-links\">" + nplate + " " + full_name + "</a></div>";
            }
            
            cust_dropdown.innerHTML = dropdown_content;
            addListeners();
            
            // If user has only 1 vehicle then pre-load it
            if(nplate_list.length == 1){
                select_customer_express(nplate_list[0]);
            }
        });
    });
}
//加载用户数据////从后端驱动分数
函数loadUserData(用户){
var docRef=全局数据库集合(“客户数据”).doc(“web-app-user-data”);
docRef.get().then(函数(doc){
var data=doc.data();
全局用户数据=数据[“用户”][user.email];
//console.log(全局用户数据[“车牌号]);
var user_name=全局用户数据[“name”]+“”+全局用户数据[“姓氏”];
document.getElementById(“welcome\u div”).innerHTML=用户名;
var nplate_list=全局用户数据[“车牌号”];
log(“这些是nplates:+nplate_列表”);
返回nplate_列表;
})
.然后(功能(nplate_列表){
var docRef=全局_db
.收集(“客户数据”)
.doc(“web应用程序车辆数据”);
docRef.get().then(函数(doc){
全局车辆数据=文档数据()[“车辆”];
var cust_dropdown=document.getElementById(“cust搜索下拉列表”);
下拉菜单_content=“”;
对于(nplate_列表的nplate){
//控制台日志(nplate);
var full\u name=通过nplate获取完整名称(全局车辆数据,nplate);
下拉菜单内容+=“”;
}
cust_dropdown.innerHTML=下拉内容;
addListeners();
//如果用户只有1辆车,则预加载
如果(nplate_list.length==1){
选择_客户_快递(nplate_列表[0]);
}
});
});
}

问题在于,在所有承诺完成之前,您可能正在阅读
下拉列表内容。您必须等待所有的
获取完整的\u name\u by \u nplate
完成

不幸的是,您的代码编写得如此之好,以至于您一次又一次地下载车辆数据

最好是将两个文档加载一个接一个地链接起来。否则,它将很慢,而且成本相当高,因为您将按获取的每个文档计费

function get_full_name_by_nplate(data, nplate) {

    given_name = data["vehicles"][nplate]["policy_holder_given_name"];
    family_name = data["vehicles"][nplate]["policy_holder_family_name"];

    return given_name + " " + family_name;
  
}

//load user data ////driving scores from backend
function loadUserData(user) {
  var nplate_list;

  var docRef = global_db.collection("customer_data").doc("web-app-user-data");
  docRef
    .get()
    .then(function (doc) {
      var data = doc.data();
      user_data = data["users"][user.email];
      nplate_list = user_data["number_plates"];
    })

    .then(function () {
      var docRef = global_db
        .collection("customer_data")
        .doc("web-app-vehicle-data");
      return docRef.get();
    })

    .then(function (doc)  { return doc.data()})

    .then(function (vehicle_data) {
      for (nplate of nplate_list) {
       var full_name=  get_full_name_by_nplate(vehicle_data,nplate);
          dropdown_content +=
            '<div class="cust-dropdown-items"><a href="#" id="' +
            nplate +
            '" class="number-plate-links">' +
            nplate +
            " " +
            full_name +
            "</a></div>";
        
      }
      // now you do things with `dropdown_content`
    });
}
函数按nplate获取完整名称(数据,nplate){
给定名称=数据[“车辆”][nplate][“保单持有人给定名称”];
family_name=数据[“车辆”][nplate][“保单持有人_family_name”];
返回给定的_name+“”+姓氏;
}
//加载用户数据///从后端驱动分数
函数loadUserData(用户){
var nplate_列表;
var docRef=全局数据库集合(“客户数据”).doc(“web应用程序用户数据”);
docRef
.get()
.然后(功能(文档){
var data=doc.data();
user_data=data[“users”][user.email];
nplate_list=用户_数据[“车牌号”];
})
.然后(函数(){
var docRef=全局_db
.收集(“客户数据”)
.doc(“web应用程序车辆数据”);
返回docRef.get();
})
.then(函数(doc){return doc.data()})
.然后(功能(车辆数据){
对于(nplate_列表的nplate){
var full\u name=通过nplate获取完整名称(车辆数据,nplate);
下拉菜单内容+=
'";
}
//现在,您可以使用“下拉内容”进行操作`
});
}

问题在于,在所有承诺完成之前,您可能正在阅读
下拉列表内容。您必须等待所有
通过nplate获得完整的姓名

不幸的是,您的代码编写得如此之好,以至于您一次又一次地下载车辆数据

最好是将两个文档加载一个接一个地链接起来,否则会很慢,而且成本相当高,因为每个文档都要付费

function get_full_name_by_nplate(data, nplate) {

    given_name = data["vehicles"][nplate]["policy_holder_given_name"];
    family_name = data["vehicles"][nplate]["policy_holder_family_name"];

    return given_name + " " + family_name;
  
}

//load user data ////driving scores from backend
function loadUserData(user) {
  var nplate_list;

  var docRef = global_db.collection("customer_data").doc("web-app-user-data");
  docRef
    .get()
    .then(function (doc) {
      var data = doc.data();
      user_data = data["users"][user.email];
      nplate_list = user_data["number_plates"];
    })

    .then(function () {
      var docRef = global_db
        .collection("customer_data")
        .doc("web-app-vehicle-data");
      return docRef.get();
    })

    .then(function (doc)  { return doc.data()})

    .then(function (vehicle_data) {
      for (nplate of nplate_list) {
       var full_name=  get_full_name_by_nplate(vehicle_data,nplate);
          dropdown_content +=
            '<div class="cust-dropdown-items"><a href="#" id="' +
            nplate +
            '" class="number-plate-links">' +
            nplate +
            " " +
            full_name +
            "</a></div>";
        
      }
      // now you do things with `dropdown_content`
    });
}
函数按nplate获取完整名称(数据,nplate){
给定名称=数据[“车辆”][nplate][“保单持有人给定名称”];
family_name=数据[“车辆”][nplate][“保单持有人_family_name”];
返回给定的_name+“”+姓氏;
}
//加载用户数据///从后端驱动分数
函数loadUserData(用户){
var nplate_列表;
var docRef=全局数据库集合(“客户数据”).doc(“web应用程序用户数据”);
docRef
.get()
.然后(功能(文档){
var data=doc.data();
user_data=data[“users”][user.email];
nplate_list=用户_数据[“车牌号”];
})
.然后(函数(){
var docRef=全局_db
.收集(“客户数据”)
.doc(“web应用程序车辆数据”);
返回docRef.get();
})
.then(函数(doc){return doc.data()})
.然后(功能(车辆数据){
对于(nplate_列表的nplate){
var full\u name=通过nplate获取完整名称(车辆数据,nplate);
下拉菜单内容+=
'";
}
//现在,您可以使用“下拉内容”进行操作`
});
}
通过nplate(车辆数据,nplate)获取完整名称。然后((完整名称)=>