以下のコードは今日まで正常に機能します。しかし、私は今それが機能していないことを知らず、以下のエラーを出します。理由を教えてください。
エラー:無効なデータで関数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;
}
予算の配列を純粋な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オブジェクトを使用します
以下に、ドキュメントの内容のスクリーンショットがあります。
オブジェクトを文字列化し、再度オブジェクトに解析して、オブジェクトのクラス名を削除できます。
const budgets = this.budgetProvider.createBudgets(JSON.parse(JSON.stringify(data.budgetList)), projectId);
次のようなスプレッド演算子を使用することもできます。
this.fireStore
.doc<Project>(`projects/${projectId}/`)
.set( {...proj} ))
それは私のために働く
エラーは、入力されたデータが無効であることを示すだけです!
また、どこからでもエラーに直面しました。これは、値を取得して何らかのコレクションのドキュメントにアップロードするはずだった入力フィールドをインターフェイスから削除したためです。
注:不要なフィールドがあるかどうかは、.tsファイルfirebase.firestore().collection("some_name").add() / set()
のコードを確認してください。