web-dev-qa-db-ja.com

無効なデータで関数DocumentReference.set()が呼び出されました。サポートされていないフィールド値:カスタムBudgetオブジェクト

以下のコードは今日まで正常に機能します。しかし、私は今それが機能していないことを知らず、以下のエラーを出します。理由を教えてください。

エラー:無効なデータで関数DocumentReference.set()が呼び出されました。サポートされていないフィールド値:カスタムBudgetオブジェクト

 export class Project {
        id: string = null;
        name: string;
        budgetList?: Budget[];
    }

export class Budget {
    id: string;
    amount: number;
    contingency: number = 20;
    budgetGroup: BudgetGroup = new BudgetGroup();
    creationTime: string;
}

コード:

  async create(data: DtoProject): Promise<Project> {
    try {
      const projectId: string = this.fireStore.createId();
      const budgets = this.budgetProvider.createBudgets(data.budgetList, projectId);//budgets
      const proj: Project = {
        id: data.id,
        name: data.name,
        budgetList: budgets,//here it has the error
      }
      proj.id = projectId;
      await this.fireStore.doc<Project>(`projects/${projectId}/`).set(proj));//project
      }
 }

  createBudgets(data: Budget[], projectId: string): Budget[] {
    let budgets: Budget[] = [];
    forEach(data, (d) => {
      const budgetId: string = this.fireStore.createId();
      d.id = budgetId;
      budgets.Push(d);
      this.fireStore.doc<Budget>(`projects/${projectId}/budgets/${budgetId}`).set({
        id: budgetId,
        amount: d.amount,
        contingency: d.contingency,
        budgetGroup: d.budgetGroup,
        creationTime: moment().format()
      })
    })
    return budgets;
  }
26
Sampath

予算の配列を純粋なJavaScriptオブジェクトの配列に変換()する必要があります

最初の一歩:

const budgets = arrayOfBudget.map((obj)=> {return Object.assign({}, obj)});

第二段階:

const proj: Project = {
      id: data.id,
      name: data.name,
      budgetList: budgets
    }

その後、あなたは行ってもいいです。

ところで、JavaScriptにコンパイルされる言語で開発する場合、カスタムオブジェクトは使用できません。代わりに、Firestoreデータベースに保存するには、純粋なJavaScriptオブジェクトを使用する必要があります。

たとえば、次のクラスがあるとします。

export class User {
        id: string;
        name: string;
    }

そして、次のコードを実行しようとします。

 const user = new User();   
 this.db.collection('users').doc().set(user)

次のようなエラーが表示されます。

無効なデータ。データはオブジェクトである必要がありますが、それはカスタムユーザーオブジェクトでした。

ここで、次のコード行を実行しようとすると:

 this.db.collection('users').doc().set(Object.assign({}, user))

オブジェクトがデータベースに保存されたことがわかります。基本的にObject.assignは以下と同じことをします:

this.db.collection('users').doc().set({id: user.id , name: user.name})

Object.assignを使用すると、時間を大幅に節約できます。

UPDATE

以下のコメントで指摘したように、カスタムオブジェクトhere についてのドキュメントの内容を見つけることができます。ご覧のとおり、次のような警告があります。

// WebはJavaScriptオブジェクトを使用します

以下に、ドキュメントの内容のスクリーンショットがあります。

enter image description here

オブジェクトを文字列化し、再度オブジェクトに解析して、オブジェクトのクラス名を削除できます。

const budgets = this.budgetProvider.createBudgets(JSON.parse(JSON.stringify(data.budgetList)), projectId);
9
MalindaK

次のようなスプレッド演算子を使用することもできます。

this.fireStore
  .doc<Project>(`projects/${projectId}/`)
    .set( {...proj} ))

それは私のために働く

1
Andres Gardiol

エラーは、入力されたデータが無効であることを示すだけです!

また、どこからでもエラーに直面しました。これは、値を取得して何らかのコレクションのドキュメントにアップロードするはずだった入力フィールドをインターフェイスから削除したためです。

注:不要なフィールドがあるかどうかは、.tsファイルfirebase.firestore().collection("some_name").add() / set()のコードを確認してください。

0