【发布时间】:2021-07-01 02:41:42
【问题描述】:
我有一个问题: 在我的 Angular 应用程序中,我使用了很多具有继承的类,但我只是注意到,在尝试将这些对象保存到 firebase 时,我收到一个错误消息,说我正在尝试保留一些海关对象,但事实并非如此支持。
这是错误:
ERROR FirebaseError: Function DocumentReference.set() called with invalid data (via `toFirestore()`). Unsupported field value: a custom object (found in field itinerary in document trips/iLK63UGEsYpZbn2NG2N7)
at new n (http://localhost:8100/vendor.js:39963:23)
at Gu (http://localhost:8100/vendor.js:53855:16)
at t.i_ (http://localhost:8100/vendor.js:53575:16)
at Mu (http://localhost:8100/vendor.js:53808:37)
at Uu (http://localhost:8100/vendor.js:53692:50)
at http://localhost:8100/vendor.js:53792:17
at _ (http://localhost:8100/vendor.js:40153:68)
at Cu (http://localhost:8100/vendor.js:53791:56)
at Ru (http://localhost:8100/vendor.js:53616:19)
at n.set (http://localhost:8100/vendor.js:55193:40)
defaultErrorLogger @ core.js:5980
那么如何序列化呢?
因为我有一些复杂的对象,它们会有一些很好的辅助方法,而且我看不到转换模型的简单方法。
这是目前的最低型号:
export class Trip {
id: string;
owner: string;
name: string;
startDate: Date;
endDate: Date | undefined;
coverImageUrl: string;
itinerary: Itinerary;
constructor() {
this.itinerary = new Itinerary();
}
}
export class Itinerary {
stats: ItineraryStats;
steps: Step[];
constructor() {
this.steps = Step[0];
this.stats = new ItineraryStats();
}
}
export class ItineraryStats {
duration: number;
driveTime: number;
driveDistance: number;
averageDriveDistancePerDay(): number {
return this.driveDistance / this.duration;
}
averageDriveTimePerDay(): number {
return this.driveTime / this.duration;
}
}
export abstract class Step {
start: Date;
end: Date;
duration: number;
enforcedStartStop: boolean;
warning: string;
}
export abstract class StopStep extends Step {
id: string;
name: string;
description: string;
pointOfInterest: PointOfInterest | null;
address: string;
coordinates: firebase.firestore.GeoPoint;
}
export class ActivityStep extends StopStep {
duration: number;
constructor() {
super();
this.id = Guid.newGuid();
}
}
export class NightStep extends StopStep {
nightNumber: number;
numberOfNight: number;
}
export class PointOfInterest {
type: PointOfInterest;
}
export class TravelStep extends Step {
Mode: TravelMode;
PolyLines: string;
}
我正在尝试在这里保存一次旅行。
我正在使用 NGXS + Angular fire,但我猜只有 angularfire 会出现相同的错误。
我尝试使用将 typescript 转换为 json 的库(classToPlain),但它不起作用,因为某些对象是 Firebase 的对象,它们应该保持类(GeoPoint)而不是被转换。
【问题讨论】:
-
您可以添加您的尝试和错误消息以帮助其他人复制问题吗?
-
@vitooh 我添加了更多信息:)
-
为什么不使用 JSON.stringify 将 typescript 转换为简单的 json 并在读取时使用 copyInto 从 json 形成 typescript 对象?
-
因为我没有一个级别的类,而是几个,并且某些字段是抽象对象的集合。但是,如果您知道如何使用 JSON.stringify 执行此操作,我会很高兴看到您如何进行?
-
JSON.stringify将序列化深层对象。但问题是,你将如何反序列化那个东西,因为你不知道Itinerary类中的正确类型抽象类型Step。Itinerary类中的步骤数组变得异构,这会导致所有问题。
标签: angular typescript firebase google-cloud-firestore angularfire2