javascript Firebase错误:函数查询. where()调用时使用了无效数据,不支持的字段值:在我使用react native和firebase之间未定义

pgvzfuti  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(92)

当我登录时,我试图只获取已登录用户的消息,但我收到此错误,我不知道是什么问题。
我的代码:

const UserInbox = () => {

    const [userData, setUserData] = useState([]);
    const message = db.collection('feedback').where('recipient','==',userData.uid)
    const[recipient,setRecipient]=useState("")
    const[messageText,setMessageText]=useState("")
 

    {/*fetch only logged in user messages from database*/}
    const fetchData = async()=>{
        try {
            const list=[];
             await message
           //  .orderBy('submitTime','desc')
            .get()
            .then((querySnapshot)=>{
                querySnapshot.forEach((doc)=>{
                    const {userId,recipient,messageText,} = doc.data()
                    list.push({
                        id:doc.id,
                        userId,
                        recipient,
                        messageText
                       // sendTime,
                        
                    })
                })
    
            })
            setUserData(list)
            if(loading){
                setLoading(false)
            }
        } catch (error) {
            
        }
    }
    useEffect(()=>{
        fetchData()
    },[])

    function renderBody(){
        return(
            <ScrollView>
                 
            <FlatList 
                data={userData}
                numColumns={1}
                renderItem={({item})=>(
                <>
             <Swipeable 
                renderRightActions={()=>ListItemDelet(item.id)}> 
                <View>
                    <View>
                       <View style={{flexDirection:'row'}}>
                      <View>
                       <Text></Text>
                       <Text>{item.recipient}</Text>
                      </View>  

                      <TouchableOpacity  
                          onPress={()=>{
                             setRecipient(item.recipient),
                             setMessageText(item.messageText);
                           setModalVisible(true)}}>

                        <Text style={{
                            fontWeight:'600'
                        }}>View</Text>
                        </TouchableOpacity>
                      </View>                    
                    </View>
                </View>
                </Swipeable>
               </>
             )}
             />

             <View style={{
                position:'absolute',
                top:100,
                
             }}>
             <AppModal
                   modalVisible={modalVisible} 
                   setModalVisible = {setModalVisible} 
                   name={recipient}
                   messageText={messageText}
                   
               
                />    
             </View>
             
            
            </ScrollView>
           
        )
    }

所以当我使用. where('recipient ','==',useData. uid)时,我得到这个错误,当我删除它时,代码可以正常工作。然而,我的目标是只从数据库中检索属于登录用户的消息。因此,每个用户登录只能访问他/她的消息。任何帮助都非常感谢。

eit6fx6z

eit6fx6z1#

您将userData定义为数组,但试图将其作为对象(user.uid)访问。
const [userData, setUserData] = useState([]);
const message = db.collection('feedback').where('recipient','==',userData.uid)
因此,问题是当您在下面的useEffect中装载组件时,您运行的fetchData()依赖于messagemessage使用undefined进行recipient比较。
看起来你想从其他地方得到uid,因为在fetchData()中你用一个项目列表设置userData--所以你不能依赖userData,因为它是空的/未定义的。
查看uid实际上应该来自何处。

**更新答案

Firebase Function中,为了确保调用函数的用户经过身份验证(已登录),请使用onCall类型函数中的context参数:

.https.onCall(async (data, context) => {
  if (context.auth == undefined) {
    throw new functions.https.HttpsError(
      'failed-precondition',
      'The user must be authenticated.',
    );
  }
  const uid = context?.auth?.uid as string;
  
  ...

  // Do your uid-based queries here.
  const message = db.collection('feedback').where('recipient','==', uid)

  ...

});

如果没有帮助,请告诉我!

相关问题