Javascript Firestore查询未获取最新数据
我在Angular中制作了一个route guard,它在允许访问所述路线之前检查firestore中的某个值 HTTP云功能完成后,组件将被路由到。此云函数在firestore文档中创建一个名为Javascript Firestore查询未获取最新数据,javascript,angular,firebase,google-cloud-firestore,rxjs,Javascript,Angular,Firebase,Google Cloud Firestore,Rxjs,我在Angular中制作了一个route guard,它在允许访问所述路线之前检查firestore中的某个值 HTTP云功能完成后,组件将被路由到。此云函数在firestore文档中创建一个名为协议的对象,然后路由监听该对象内的状态,以决定是否允许访问。但是,我们遇到的问题是,可能有9/10次,守卫似乎认为协议对象在文档中不存在,因此抛出错误。(尽管我可以在firestore中看到协议对象!) 我已经记录了流,它正确地记录在订阅中,然后记录在guard中,因此我知道HTTP函数在尝试路由和调用
协议
的对象,然后路由监听该对象内的状态,以决定是否允许访问。但是,我们遇到的问题是,可能有9/10次,守卫似乎认为协议
对象在文档中不存在,因此抛出错误。(尽管我可以在firestore中看到协议对象!)
我已经记录了流,它正确地记录在订阅中,然后记录在guard中,因此我知道HTTP函数在尝试路由和调用guard类之前已经完成
这是警卫:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.tenancyOffer$ = this._tenancyOffer.getTenancyOfferById(route.params.offerId).get({source: 'server'})).valueChanges();
return this.tenancyOffer$.pipe(
map((tenancyOffer) => {
if (tenancyOffer.status === 'incomplete'
&& tenancyOffer.agreement.status === 'incomplete') {
return true;
} else {
this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
}
})
);
}
GetTenancyOfferById:
this.tenancyOfferCollection = afs.collection<any>('tenancy_offers');
getTenancyOfferById(id: string) {
return this.tenancyOfferCollection.doc(id);
}
我对整个firestore文档做出了云函数的响应,其中包含协议对象,该对象记录在console.log({e})中代码>。然后,我在guard中记录(之后)文档的值,但它不存在,即使我在这里再次调用firestore
有人知道为什么guard中的gettenacyOfferById(route.params.offerId)
函数没有从firestore返回此文档的最新版本,即使云函数需要在订阅路由之前结束吗?我猜this.tenacyOfferCollection=afs.collection('tenancy_offers');
是在您的服务中的某个位置定义的。如果这是真的,则在加载应用程序后将立即加载集合
我建议在您的服务中存储u提供的值,并从您的警卫处读取
服务:
export class YourService {
private tenancyOfferMap: Map<string, any> = new Map();
constructor(
private afs: AngularFirestore,
) {
afs.collection<any>('tenancy_offers').snapshotChanges()
.subscribe( actions => {
actions.map( action => {
this.tenancyOfferMap.set(action.payload.doc.id, action.payload.doc.data());
});
});
}
getTenancyOfferById(id: string) {
return this.tenancyOfferMap.get(id);
}
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
const tenancyOffer = this.yourService.getTenancyOfferById(route.params.offerId);
if (tenancyOffer.status === 'incomplete'
&& tenancyOffer.agreement.status === 'incomplete') {
return true;
} else {
return this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
}
}
导出类服务{
private-tenacyOfferMap:Map=new-Map();
建造师(
私人afs:AngularFirestore,
) {
afs.collection('tenancy_offers')。快照更改()
.订阅(操作=>{
actions.map(action=>{
this.tenacyOfferMap.set(action.payload.doc.id,action.payload.doc.data());
});
});
}
getTenancyOfferById(id:string){
返回此.tenacyOfferMap.get(id);
}
}
守卫:
export class YourService {
private tenancyOfferMap: Map<string, any> = new Map();
constructor(
private afs: AngularFirestore,
) {
afs.collection<any>('tenancy_offers').snapshotChanges()
.subscribe( actions => {
actions.map( action => {
this.tenancyOfferMap.set(action.payload.doc.id, action.payload.doc.data());
});
});
}
getTenancyOfferById(id: string) {
return this.tenancyOfferMap.get(id);
}
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
const tenancyOffer = this.yourService.getTenancyOfferById(route.params.offerId);
if (tenancyOffer.status === 'incomplete'
&& tenancyOffer.agreement.status === 'incomplete') {
return true;
} else {
return this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
}
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|布尔| UrlTree{
const tenacyOffer=this.yourService.gettenacyOfferById(route.params.offerId);
如果(tenancyOffer.status==‘未完成’
&&tenancyOffer.agreement.status==“未完成”){
返回true;
}否则{
返回此文件。_router.navigate(['/'+lown.base,lown.manage.base,lown.manage.applications.base,route.params.propId,lown.manage.applications.summary,route.params.offerId]);
}
}
这可能取决于您的流未完成这一事实
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){
this.tenacyOffer$=this.\u tenacyOffer.gettenacyOfferById(route.params.offerId).get({source:'server'})).valueChanges()
.管道(取(1));//{
如果(tenancyOffer&&tenancyOffer.status===‘未完成’
&&tenancyOffer.agreement.status==“未完成”){
返回true;
}否则{
此.u router.navigate(['/'+lown.base,lown.manage.base,lown.manage.applications.base,route.params.propId,lown.manage.applications.summary,route.params.offerId]);
return false;//你能给我看一下你的this.\u tenacyOffer.gettenacyOfferById(route.params.offerId)的代码吗.get
?@N.F.我已将其添加到我的问题中!恐怕仍然存在相同的问题!您是否100%确定route.params.offerId
填充了正确的值?共享您的数据模型/结构示例可能也会有所帮助。