You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase9 Storage TS报错:类型'Promise<UploadResult>'不存在属性'on'怎么解决

问题原因

你使用了错误的上传API导致类型不匹配:

  • uploadBytes 方法返回的是 Promise<UploadResult> 类型,本身仅会返回上传完成后的结果,没有提供事件监听的on方法,仅适合不需要跟踪上传进度的场景
  • 如果需要监听上传进度、状态变化,必须使用 uploadBytesResumable 方法,该方法返回的 UploadTask 类型才支持.on事件监听

解决方案

第一步:调整API导入

从firebase/storage中新增导入uploadBytesResumable方法和对应的TS类型:

import { ref as storageRef, uploadBytesResumable, type UploadTaskSnapshot } from "firebase/storage";

第二步:替换上传逻辑

把原来的uploadBytes调用替换为uploadBytesResumable,同时可以补充常用的响应式状态方便外部使用,完整修正后的代码如下:

import { projectStorage } from "@/firebase/config";
import { ref, watchEffect } from "vue";
import { ref as storageRef, uploadBytesResumable, type UploadTaskSnapshot } from "firebase/storage";

const useStorage = (file: File) => {
  // 对外暴露的响应式状态,可根据业务需要调整
  const uploadProgress = ref<number>(0)
  const uploadError = ref<Error | null>(null)
  const downloadUrl = ref<string | null>(null)

  watchEffect(() => {
    const storageReference = storageRef(projectStorage, "images/" + file.name);
    // 使用支持进度监听的断点续传上传方法
    const uploadTask = uploadBytesResumable(storageReference, file);
    
    // 监听上传状态变化
    uploadTask.on("state_changed", 
      (snapshot: UploadTaskSnapshot) => {
        // 计算实时上传进度
        uploadProgress.value = Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100)
      },
      (error) => {
        uploadError.value = error
      },
      async () => {
        // 上传完成后获取文件下载地址
        downloadUrl.value = await uploadTask.snapshot.ref.getDownloadURL()
      }
    );
  });

  return { uploadProgress, uploadError, downloadUrl }
};
export default useStorage;

内容的提问来源于stack exchange,提问作者TinyTiger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:27:04