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

如何将Firebase Storage中的图片获取到Next.js网站?

解决Next.js从Firebase Storage获取图片时的"Image is missing required 'src' property"错误

问题根源与修复步骤

  • 核心错误:Image组件属性用错
    你写的source={{ uri:url }}是React Native的Image写法,Next.js的Image组件需要用src属性,直接传入URL即可,不需要包裹uri对象。

  • 遗漏Image组件导入
    代码里使用了<Image>但没有从next/image导入,导致组件无法被正确识别。

  • 初始空状态处理
    url初始值为undefined,直接渲染会触发属性缺失错误,需要添加加载状态或条件渲染。

  • 异步代码优化
    你的异步函数同时混用了await和.then(),统一用await能让代码更简洁易读。

  • 添加错误捕获
    获取Firebase下载链接可能失败,捕获异常能避免页面崩溃并排查问题。


修改后的完整代码

import { useState, useEffect } from "react";
import { firebaseConfig } from "@/firebase/firebase";
import { initializeApp } from "@/firebase/firebase";
import { getStorage, ref, getDownloadURL } from "firebase/storage";
import Image from "next/image"; // 导入Next.js官方Image组件
import styles from "../../styles/collections.module.css";

initializeApp(firebaseConfig);

export default function Test() {
    const [url, setUrl] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        const fetchImageUrl = async () => {
            try {
                const storage = getStorage();
                const reference = ref(storage, 'collections/amsterdam/bedroom/image10.avif');
                const downloadUrl = await getDownloadURL(reference);
                setUrl(downloadUrl);
            } catch (err) {
                setError(err.message);
                console.error("获取图片URL失败:", err);
            } finally {
                setLoading(false);
            }
        };

        fetchImageUrl();
    }, []);

    if (loading) return <div className={styles.test_container}>加载中...</div>;
    if (error) return <div className={styles.test_container}>加载失败:{error}</div>;

    return (
        <div className={styles.test}>
            <div className={styles.test_container}>
                <h1>从Firebase获取图片到Next.js项目</h1>
                {url && (
                    <Image
                        src={url} // 替换为Next.js要求的src属性
                        width={500}
                        height={500}
                        alt="阿姆斯特丹卧室图片" // 不要留空alt,提升可访问性
                    />
                )}
            </div>
        </div>
    );
}

额外注意事项

  • 确保Firebase Storage的规则允许访问目标图片:如果是公开资源,规则需设置为允许读取;私有资源则需要配置用户认证。
  • 若遇到跨域问题,需在next.config.js中添加Firebase Storage的域名:
    // next.config.js
    module.exports = {
      images: {
        domains: ['firebasestorage.googleapis.com'],
      },
    };
    

内容的提问来源于stack exchange,提问作者João Pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45