概要
-
gatsby build
時にWebpackError: TypeError: Cannot read property 'hoge' of undefined
が発生 - hogeはプロパティ名
- Nelifyへのデブロイ時も発生
-
gatsby develop
では発生せず正常にbuildされる
対処法
エラーとなっているプロパティ(この場合はhoge)の前に?.
を付け、?.hoge
とすることで解消しました。
何をしようとしてエラーになったのか
Gatsby.jsでブログを作成している中で、以下のようなコードを書いていました。
const data = useStaticQuery(graphql`
query{
allFile {
nodes {
name
publicURL
}
}
}
`)
const eyecatch = data.allFile.nodes.find( file => file.name === category).publicURL // ここがエラー
アイキャッチ用の画像ファイルをカテゴリ名と同一名称で特定のディレクリに置いておき、そのpublicURL
をGraphQLで取得するという処理です。
上記コードの中のプロパティpublicURL
がgatsby build
でエラーになってしまっていました。
冒頭の通り、この部分を
const eyecatch = data.allFile.nodes.find( file => file.name === category)?.publicURL
とすることでエラーは解消しました。
?.
とは何なのか
調べてみると、オプショナルチェイング演算子と呼ばれるものみたいです。
MDNによると、深い入れ子構造になったサブプロパティにアクセスする際は、各プロパティ間の参照を確認する必要があるとのこと。今回のコードで言うと、data.allFile.nodes
内にfind
でヒットした要素が存在することを確認した上で、publicURL
を取得する必要があるようです。
これを暗黙的にやってくれるのが、オプショナルチェイング演算子です。
残った謎
なぜ、gatsby develop
ではエラーが発生せず、gatsby build
のみ発生するのかが不明です…。