为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL

Posted

技术标签:

【中文标题】为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL【英文标题】:Why asynchronous function "getDownloadURL" are used to get file URLs in Firebase Storage为什么使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL 【发布时间】:2021-12-15 09:06:47 【问题描述】:

为了获取上传到 Cloud Storage 的文件的 URL,我们必须编写如下代码。

import  getStorage, ref  from 'firebase/storage'

const storage = ref(getStorage(firebaseApp))
const url = await getDownloadURL(ref(storage, 'images/sample.jpg'))

为什么我们需要调用异步函数而不是一开始就知道唯一文件的 URL? 我猜当您调用“getDownloadURL”时身份验证已完成。 但是,如果需要进行身份验证,为什么不为文件发布一个唯一的 URL,然后在调用该 URL 时进行身份验证?

【问题讨论】:

【参考方案1】:

为什么我们需要调用异步函数而不是一开始就知道唯一文件的 URL?

这是因为下载地址是在服务器上生成的。数据成功上传到 Firebase 存储后,此 URL 即可使用。这是一个异步操作,因为将数据实际上传到服务器需要时间。根据连接速度和状态以及数据的大小,完成上传可能需要几百毫秒到几秒钟的时间。除此之外,该 URL 还包含一个令牌,该令牌会在文件上传到 Cloud Storage 时自动创建。它是一个随机令牌,这使得 URL 难以猜测。

这就是您无法提前知道最终下载 URL 的原因。这与在实时数据库中推送 ID 或在 Firestore 中生成文档 ID 不同,两者都在客户端上进行。

【讨论】:

感谢您的清晰解释,我的问题得到了解答。谢谢。【参考方案2】:

我假设您使用的是 Firebase 网页版。其他平台应该也是一样的。

似乎它是异步的,因为它需要网络请求才能获取下载 URL,并且正如您所说,它也执行身份验证(通过存储规则)。

但是,如果需要进行身份验证,为什么不为文件发布一个唯一的 URL,然后在调用该 URL 时执行身份验证?

我的假设:假设您调用 1000 张图像,当它们要渲染时,由于用户未通过身份验证,它会失败。当然,这不是一个好的用户体验 - 最好在请求期间失败,这样您就可以向用户显示请求失败的一些反馈,可能通过使用警报、模式或类似的方式。

参考资料:

Check out the source code of getDownloadUrl here。 The implementation of the above function in code。 Firebase Storage for Web。

【讨论】:

以上是关于为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 存储期货问题

Firebase 存储子引用 getDownloadURL 返回“childPath.split 不是函数”

为啥这个异步函数没有异步运行?

为啥这个异步函数返回未定义? [复制]

使用 react suspense 从 Firebase 异步加载

为啥这个异步函数无限循环?