无法在firebase + vue中检索用户详细信息和图像

Posted

技术标签:

【中文标题】无法在firebase + vue中检索用户详细信息和图像【英文标题】:Cannot retrieve user details and image in firebase + vue 【发布时间】:2022-01-22 04:13:59 【问题描述】:

美好的一天。 拜托,我需要以下关于我的 vue + firebase 代码的帮助。我可以成功上传用户详细信息和图像,但我很难在我的 vue 组件上显示图像。这些值在 Devtools 中返回为未定义。请帮帮我...

  methods: 
  async storeCourse() 
            try 
                this.isLoading = false
                // upload file
                const fileRef = 'uploads/courses/' + this.file.name
                const snapshot = await storage.ref(fileRef).put(this.file)
                let data = 
                    userId: auth.currentUser.uid,
                    subject: this.subject,
                    description: this.description,
                    tutor: this.tutor,
                    payment: this.payment,
                    duration: this.duration,
                    amount: this.amount,
                    years_exp: this.years_exp,
                    image: fileRef
                
                window.alert('Added!')
                const docRef = coursesCollection.doc(); 
                data.id = docRef.id; 
                const doc = await docRef.set(data);
                // const doc = await coursesCollection.add(data)
                this.$emit('course:added', data)
                await this.resetForm()
                this.isLoading = false
                this.dialog = false
             catch(e) 
                console.log(e)
            
        ,
async getUser() 
            try 
                // const querySnapshot = await coursesCollection.where('userId', '==', auth.currentUser.uid).get()
                const querySnapshot = await usersCollection.where('userId', '==', auth.currentUser.uid).get()
                querySnapshot.forEach( async (doc) => 
                    let img = ''
                    if(doc.data().id_upload) 
                        img = await storage.ref().child(doc.data().id_upload).getDownloadURL()
                    
                    this.profile.push(
                        id_upload: img,
                        img: doc.data().id_upload
                    )
                )
             catch(e) 
                console.log(e)
            
        ,
,
 async mounted() 
        await this.getGames()
                await this.getUser()

    

我正在尝试通过以下方式访问数据:

<h1>Hi, profile.name </h1>
        
         <v-img :src="profile.id_upload"></v-img>

我已将我的 getUser() 更改为下面的代码,它说记录未找到,而记录正常存在。

 async getUser() 
            let ref = usersCollection.where('userId', '==', auth.currentUser.uid).get()
            .then(snapshot =>   //DocSnapshot
                if (snapshot.exists) 
                    let profile = snapshot.data()
                 else 
                    // snapshot.data() will be undefined in this case
                    console.log("No such document!");
                  
            )
        ,

请问我哪里漏掉了?

【问题讨论】:

【参考方案1】:

当用户上传照片时,您是否有任何理由不直接将 downloadURL 保存到 firestore 文档?那么只需通过文档获取 url,而不是尝试直接从存储中获取 downloadURL?

编辑:所以你在评论中提到的方法只是给你文件路径。如果您想删除照片,您将使用它。但实际的 URL 是不同的值。

我会附上我用来上传到 Firebase 存储的代码,希望你可以从那里玩弄它并获得一些工作。我个人不使用 Vue2(从 VUE3 开始),因此代码可能需要对您进行一些调整。或修改可组合为您工作。希望对您有所帮助。

 // my composable code

import  projectStorage  from "../firebase/config";
import  ref  from "vue";

const useStorage = () => 
  const error = ref(null);
  const imageUrl = ref(null);
  const imagefilePath = ref(null);

  const uploadImage = async (file) => 
    imagefilePath.value = 'uploads/courses/' + this.file.name';
    const storageRef = projectStorage.ref(imagefilePath.value);

    try 
      const res = await storageRef.put(file);
      ImageUrl.value = await res.ref.getDownloadURL();
     catch (err) 
      console.log(err.message);
      error.value = err.message;
    
  ;

  return  imageUrl, imagefilePath, error, uploadImage ;
;





//your code modified 

 async storeCourse() 
            try 
                this.isLoading = false
                // upload file
                
                let data = 
                    userId: auth.currentUser.uid,
                    subject: this.subject,
                    description: this.description,
                    tutor: this.tutor,
                    payment: this.payment,
                    duration: this.duration,
                    amount: this.amount,
                    years_exp: this.years_exp,
                    imagePath: this.imagefilePath,     
                    image: this.imageUrl, 
                
                window.alert('Added!')
                const docRef = coursesCollection.doc(); 
                data.id = docRef.id; 
                const doc = await docRef.set(data);
                // const doc = await coursesCollection.add(data)
                this.$emit('course:added', data)
                await this.resetForm()
                this.isLoading = false
                this.dialog = false
             catch(e) 
                console.log(e)
            
        ,

【讨论】:

感谢您回答@Strid3r21。我是 vue + firebase 的新手。在这种情况下,文档中的图像字段值保存为 uploads/courses/xyz.jpg。这是我知道的存储它们的方式。你能指导我更好的方法吗?我已经更新了我的问题以反映我的商店方法。 我用一个代码示例编辑了我的回复,希望能让你朝着正确的方向前进。 我仍在努力获取用户详细信息。我似乎无法理解它。【参考方案2】:

您的代码可能在某些地方出现故障。

 async getUser() 
        let ref = usersCollection.where('userId', '==', auth.currentUser.uid).get()  //<-- are you sure auth.currentUser.uid returns a single string variable?
        .then(snapshot =>   //DocSnapshot
            if (snapshot.data())   //<-- change to this.
                let profile = ...snapshot.data(), id: snapshot.id //<--and change to this
             else 
                // snapshot.data() will be undefined in this case
                console.log("No such document!");
              
        )
    ,

这是可以玩的东西。

【讨论】:

以上是关于无法在firebase + vue中检索用户详细信息和图像的主要内容,如果未能解决你的问题,请参考以下文章

检索数据时出现 Vue/Firestore/Firebase 错误

无法从unity3d中的firebase实时数据库中检索数据

Vue 显示来自 firebase 云存储 blob 的图像

Swift 3.1 - .setValuesForKeys和Firebase无法检索用户

无法使用唯一键从 Firebase 检索用户位置数据

为啥在 Vue js 中尝试从 firebase 检索令牌时出现错误?