使用angular ngrx和firestore,set()方法返回undefined

问题描述 投票:0回答:1

我使用Angular 7,Firestore和ngRx创建了一个项目。

我正在编写我的效果,并且set()方法无法正常工作。

当使用firestore add()方法时,它工作正常,因为我得到一个DocumentReference(见tap)

(水龙头仅用于测试目的)

service.ts

createProduct(data): Observable<any> {
        return from(this.db.collection('slack').add({
            ...data
        })).pipe(
            tap(a => console.log('create: ', a))
            // here I get back a DocumentReference
        );
 }

effects.ts

@Effect()
    createProduct$ = this.actions$.ofType(productsActions.CREATE_PRODUCT)
        .pipe(
            map((action: productsActions.CreateProduct) => action.payload),
            switchMap((product) => {
                return this.productService.createProduct(product)
                    .pipe(
                        map(_product => new productsActions.CreateProductSuccess(_product)),
                        catchError((err => of(new productsActions.CreateProductFail(err))))
                    );
            })
        );

但是当使用set()方法时,我得到了undefined(参见tap)

service.ts

updateProduct(data): Observable<any> {
        return from(this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`).set({
            ...data,
        })).pipe(
            tap(a => console.log('update: ', a))
            // Here I get undefined
        );
}

effects.ts

@Effect()
    updateProduct$ = this.actions$.ofType(productsActions.UPDATE_PRODUCT)
        .pipe(
            map((action: productsActions.UpdateProduct) => action.payload),
            switchMap((product) => {
                return this.productService.updateProduct(product)
                    .pipe(
                        map(_product => new productsActions.UpdateProductSuccess(_product)),
                        catchError((err => of(new productsActions.UpdateProductFail(err))))
                    );
            })
        );

所以我的效果是期望获得一个ID,但他未定义。

为什么这适用于add()而不适用于set()/ update()?

这是我的项目:https://github.com/angulartist/ngrx-firestore-playground/blob/master/src/products/services/products.service.ts

谢谢你的帮忙

angular google-cloud-firestore store ngrx angular7
1个回答
0
投票

令人沮丧的是set()没有返回对该文件的引用。因此,在您完成set()后,在您的服务中,您可以管道流并执行地图,以便您可以获得对您执行set()的文档的引用。然后你可以switchMap()get()新更新的文件。

updateProduct(data): Observable<any> {
        return from(this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`).set({
            ...data,
        })).pipe(
            map(_ => this.db.doc(`slack/0aMwkyVWF33PF7qDIvKy`)),
            switchMap(docRef => fromPromise(docRef.get())),
            tap(a => console.log('update: ', a))
            // Here I get undefined
        );
}
© www.soinside.com 2019 - 2024. All rights reserved.