Next.js v13でfirebase storage(emulator)の画像を表示しようとしたらエラーが発生した
出会った事象
firebaseのuploadBytes
関数を用いてアップロードした画像ファイルのurlをgetDownloadURL
関数でurlを取得して以下のようにnext/Imageタグを用いて出力しようとしたところ、次のエラーが発生した
対象のコード
<Image
src={imageUrl} // getDownloadURL関数で取得したurlを使用
alt=""
...styles
/>
エラーメッセージ
Error: Invalid src prop (http://localhost:9199/v0/b/...{filepathの名前}) on `next/image`, hostname "localhost" is not configured under images in your `next.config.js`
See more info: https://nextjs.org/docs/messages/next-image-unconfigured-host
読んでみると、localhostというホスト名はnext.config.js
で設定されていないとのこと。
設定の仕方については、その下のリンクに詳しく書かれていた。
解決法
next.config.js
に次のように追記する
module.exports = {
images: {
remotePatterns: [
{
protocol: 'http',
hostname: 'localhost',
},
{
protocol: "https",
hostname: "firebasestorage.googleapis.com",
},
],
},
}
remotePatternsについて
公式でnext.config.js
のimage.remotePatterns
について以下のように説明されていた
To protect your application from malicious users, configuration is required in order to use external images. This ensures that only external images from your account can be served from the Next.js Image Optimization API. These external images can be configured with the remotePatterns property in your next.config.js file, as shown below:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
port: '',
pathname: '/account123/**',
},
],
},
}
deepL様で和訳してみると
「悪意のあるユーザーからアプリケーションを保護するため、外部画像を使用するには設定が必要です。これにより、Next.js Image Optimization APIから提供される外部画像は、自分のアカウントの画像だけになります。(略)」
つまり, firebase等の外部サービスから画像を持ってくる場合にはnext.config.js
でダウンロード先のホスト名とプロトコル等を指定してね、ということだった。
解決法についての説明
改めて自分の設定を説明すると、ローカルで使用しているエミュレータ、本番で使っているfirebasestorageのホスト名を記述することで、外部画像ファイルをダウンロードできるようにしている。
Discussion