ロゴテキスト ロゴ

    firestore v9で保存時にundefinedを許容する

    firestore v9で保存時にundefinedを許容する

    firestoreを使っていてundefinedの値を保存しようとするとエラーが起きる事があります。

    FirebaseError: Function setDoc() called with invalid data.
    Unsupported field value: undefined (found in document xxxxxxxx)




    「undefinedは使わず、プロパティ自体削除するか、明示的にnullを入れてね」

    というFirebase側の意図というのは理解しつつも、


    「undeifned許容させてパパッとアプリケーション作っちゃいたい!」というケースは往々にしてありますよね。笑




    この記事ではfirestoreで値を保存する際にundeifnedを許容する方法を記載します。

    なお、使用するfirestoreはv9です。

    検証した環境

    1 firebase 9.9.4

    firestoreで保存時にundefinedを許容する

    結論としては ignoreUndefinedProperties を設定します



    変更前

    import { initializeApp, getApps, FirebaseApp, FirebaseOptions } from 'firebase/app'
    import { getFirestore, Firestore } from 'firebase/firestore'
     
    export const firebaseConfig: FirebaseOptions = {
      ・・・
    }
     
    const firebaseApp = initializeApp(firebaseConfig)
    const firestore = getFirestore()

    変更後

    import { initializeApp, getApps, FirebaseApp, FirebaseOptions } from 'firebase/app'
    import { getFirestore, Firestore, initializeFirestore } from 'firebase/firestore'
     
    export const firebaseConfig: FirebaseOptions = {
      ・・・
    }
     
    const firebaseApp = initializeApp(firebaseConfig)
    initializeFirestore(firebaseApp, {
      ignoreUndefinedProperties: true,
    })
    const firestore = getFirestore(firebaseApp)


    やる事は大きく2点

    1. initializeFirestore を使って firebaseApp に ignoreUndefinedProperties を設定
    2. getFirestore() に firebaseApp を渡す

    getFirestore() は以下のように定義されているので firebaseApp を渡す事が出来るんですね!

    export declare function getFirestore(): Firestore;
     
    export declare function getFirestore(app: FirebaseApp): Firestore;

    この設定で冒頭のエラーが起きなくなります




    ignoreUndefinedPropertiesについて

    ignoreUndefinedProperties: true を設定した場合、

    undefinedの値はfirestoreに書き込まれません



    例えば、以下のような値を保存しようとすると

    {
      firstName: "sample",
      lastName: undefined
    }

    firestore上には

    {
      firstName: "sample",
    }

    のみ保存されているイメージですね。





    firestore v8の資料になりますが、

    [DeepL翻訳]
    ignoreUndefinedProperties: boolean

    オブジェクトのシリアル化中に未定義に設定されているネストされたプロパティをスキップするかどうか。trueに設定すると、これらのプロパティはスキップされ、Firestoreに書き込まれません。falseに設定されているか、または省略されている場合、SDKはundefinedタイプのプロパティに遭遇すると例外をスローします。

    Settings | JavaScript SDK  |  Firebase JavaScript API reference より引用

    「これらのプロパティはスキップされ、Firestoreに書き込まれません」

    と書かれている通りスキップされるようになります!

    プロフィールの背景画像 プロフィール画像
    Yuki Takara
    都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。