模拟器中的 Firebase 存储:refFromUrl() 需要一个有效的完整 URL

Posted

技术标签:

【中文标题】模拟器中的 Firebase 存储:refFromUrl() 需要一个有效的完整 URL【英文标题】:Firebase Storage in Emulator: refFromUrl() expected a valid full URL 【发布时间】:2021-10-29 02:50:46 【问题描述】:

有没有可能refFromURL() 在本地不工作?

  function deleteImage(imageUrl: string) 
    let urlRef = firebase.storage().refFromURL(imageUrl)
    return urlRef.delete().catch((error) => console.error(error))
  

传递以下网址时:

http://localhost:9199/v0/b/xxx.appspot.com/o/images%2Fdemo%2FHWEGgAPDSZrtMzbil2MwM.image%2Fjpeg?alt=media&token=a7f798ee-056a-4f03-a7bf-8453b71077e6

我收到以下错误:

Uncaught FirebaseError: Firebase Storage: refFromUrl() expected a valid full URL but got an invalid one. (storage/invalid-argument)

【问题讨论】:

【参考方案1】:

我也遇到了这个问题,没找到合适的解决办法。

我最终通过在我的应用程序中实施检查以查看 url 是否包含“localhost:9199”来解决它,如果包含,那么它应该按原样提供。如果不是,则表示代码正在生产环境中使用,需要使用 refFromUrl() 解包。

这只是一种解决方法,而不是正确的修复方法。希望其他人能帮助我们!

export default async function getPostInfo(id) 
  const ref = firestore.collection("posts").doc(id);
  const doc = await ref.get();
  const imgRef = doc.data().image;
  // To handle firebase storage emulator. .refFromURL() doesn't work with locally stored files in the emulator.
  let image;
  const regex = new RegExp(/localhost:9199/);
  if (!regex.test(imgRef)) 
    image = await storage.refFromURL(imgRef).getDownloadURL();
   else 
    image = doc.data().image;
  

  return  ...doc.data(), image, id: doc.id ;

【讨论】:

以上是关于模拟器中的 Firebase 存储:refFromUrl() 需要一个有效的完整 URL的主要内容,如果未能解决你的问题,请参考以下文章

初始化firebase模拟器存储

如何使用生产存储桶数据启动 Firebase 存储模拟器?

Firebase 存储上传适用于模拟器,但不适用于 iPhone

无法将 Firebase Cloud Storage Function 范围限定为本地模拟器上的特定存储桶

Firebase 存储没有名为 useStorageEmulator 的导出

Firebase存储规则资源变量返回null