Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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 在firebase firestore上搜索集合中的字段_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 在firebase firestore上搜索集合中的字段

Javascript 在firebase firestore上搜索集合中的字段,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我正在尝试使用电子邮件查询集合,并获取电子邮件id匹配的特定文档的文档id。我使用的代码是 checkUserExist = async (email) => { var id = await Firebase.firestore() .collectionGroup('requestBeta').where("email", "==", email).get() .then((querySnap) => { if(!quer

我正在尝试使用电子邮件查询集合,并获取电子邮件id匹配的特定文档的文档id。我使用的代码是

checkUserExist = async (email) => {
 var id = await Firebase.firestore()
  .collectionGroup('requestBeta').where("email", "==", email).get()
  .then((querySnap) => {
    if(!querySnap.empty){
      
      querySnap.forEach((doc)=>{
        return doc.data();
      })
      
    }
    else{
      return null;
    }
  })
  return id;
}

我必须检查数据库中是否存在具有特定电子邮件字段的文档,如果存在,则返回文档id,否则返回null。请注意,调用函数时,返回值存储在变量中。在目前的代码中,这返回一个未定义结果的承诺。

您的基本问题是forEach结果中的返回被简单地丢弃了,我认为在这种情况下,映射会更有用,这样您就可以将文档数据映射到一个文档数组中并返回它;大概是这样的:

checkUserExist = async (email) => {
  var id = await Firebase.firestore()
  .collectionGroup('requestBeta').where("email", "==", email).get()
  .then((querySnap) => {
   if(!querySnap.empty) {      
     let result=querySnap.map((doc)=>{
       return doc.data();
     });
     return result; //return the results of the doc.data operations
  } else return null;
})

}您的基本问题是forEach结果中的返回被简单地丢弃,我认为在这种情况下,映射会更有用,这样您就可以将文档数据映射到一个文档数组中并返回它;大概是这样的:

checkUserExist = async (email) => {
  var id = await Firebase.firestore()
  .collectionGroup('requestBeta').where("email", "==", email).get()
  .then((querySnap) => {
   if(!querySnap.empty) {      
     let result=querySnap.map((doc)=>{
       return doc.data();
     });
     return result; //return the results of the doc.data operations
  } else return null;
})

}

您在这里所做的有两个主要问题

首先,
doc.data()。如果您有一个DocumentSnapshot,您应该只使用它的
id
属性来获取它的id

其次,从内部
forEach
函数返回值不会从外部函数返回任何内容。它只从内部函数返回一个值,循环继续。返回的值将完全丢失

第三个小问题是,不需要在异步函数中使用
then
。通常不需要使用
,那么当
等待
单独使用时就可以了

您可以更简单、更正确地重写此函数:

checkUserExist = async (email) => {
  const querySnapshot = await Firebase.firestore()
    .collectionGroup('requestBeta')
    .where("email", "==", email)
    .get()

  if (!querySnapshot.empty) {
    return querySnapshot.docs[0].id;
  }
  else {
    return null;
  }
}

你在这里做的有两个主要问题

首先,
doc.data()。如果您有一个DocumentSnapshot,您应该只使用它的
id
属性来获取它的id

其次,从内部
forEach
函数返回值不会从外部函数返回任何内容。它只从内部函数返回一个值,循环继续。返回的值将完全丢失

第三个小问题是,不需要在异步函数中使用
then
。通常不需要使用
,那么当
等待
单独使用时就可以了

您可以更简单、更正确地重写此函数:

checkUserExist = async (email) => {
  const querySnapshot = await Firebase.firestore()
    .collectionGroup('requestBeta')
    .where("email", "==", email)
    .get()

  if (!querySnapshot.empty) {
    return querySnapshot.docs[0].id;
  }
  else {
    return null;
  }
}

请编辑此问题,以更详细地解释此函数除了返回undefined之外还可以执行哪些操作。您可能需要添加一些日志记录,并解释它实际上在做什么,这样我们就可以跟进了。请记住,我们无法看到您的数据库或观察此代码的运行。您必须在问题中对此进行解释。如果有帮助的话,只需添加一些详细信息。请编辑问题,以更详细地解释此函数除了返回未定义外,还可以执行哪些操作。您可能需要添加一些日志记录,并解释它实际上在做什么,这样我们就可以跟进了。请记住,我们无法看到您的数据库或观察此代码的运行。你必须在你的问题中解释这一点。如果有帮助的话,只需再添加一些细节。这个解决方案实际上有效,但只是一个小的澄清。即使我们正在使用异步并等待函数,它仍然会返回一个承诺。我需要获取变量中的返回值。我们怎样才能完成那部分?ThanksAll异步函数返回一个承诺。这是无法改变的。它允许在函数体中发生任意数量的异步行为。除此之外,您不能将返回承诺的函数的结果转换为即时结果。打电话的人总是要处理一个返回的承诺。这个解决方案实际上是有效的,只是一个小小的澄清。即使我们正在使用异步并等待函数,它仍然会返回一个承诺。我需要获取变量中的返回值。我们怎样才能完成那部分?ThanksAll异步函数返回一个承诺。这是无法改变的。它允许在函数体中发生任意数量的异步行为。除此之外,您不能将返回承诺的函数的结果转换为即时结果。打电话的人总是要处理被退回的承诺。