#node.js #angular #rxjs #server-side-rendering #angularfire
Вопрос:
У меня возникли некоторые проблемы с обслуживанием моего приложения с помощью ssr. Он отлично работает, когда он загружается при обычном использовании ng s --o
. Но когда я обслуживаю его npm run dev:ssr
и загружаю путь, иногда требуется очень много времени для обслуживания при использовании приведенного ниже решателя. Достаточно для тайм-аута при развертывании (>60 секунд). Я использую узел 10.
решение.решатель.ts
import { Injectable } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';
import {
Resolve,
RouterStateSnapshot,
ActivatedRouteSnapshot
} from '@angular/router';
import { from, Observable } from 'rxjs';
import { map, mergeMap, reduce } from 'rxjs/operators';
import { Solution } from './Solution.type';
import { AngularFireStorage } from '@angular/fire/storage';
@Injectable({
providedIn: 'root'
})
export class SolutionResolver implements Resolve<Solution[]> {
constructor(
private firestore: AngularFirestore,
private storage: AngularFireStorage
) {}
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
): Observable<any> { // Solution[]
return this.firestore.collection('solutions').get() // Observable<doc>
.pipe(
map( snapshot => snapshot.docs.map( doc => doc.data() ) as Solution[]), // Observable<Solution[]>
mergeMap( solutions => from(solutions) ), // stream of Observable<Solution>
mergeMap( solution => {
return this.storage.ref( solution.image ).getDownloadURL()
.pipe( map( url => ({...solution, image: url}) ))
}), // stream of <Observable<Solution>
reduce( (acc: Solution[], value ) => {acc.push(value); return acc; }, []) // <Observable<Solution[]>
)
}
}
Проблема может быть связана с this.storage.ref( solution.image ).getDownloadURL()
. В консоли нет сообщений об ошибках. Что еще хуже, иногда это работает так, как ожидалось.
Ранее у меня была та же проблема с использованием getDownloadURL
трубы из angularfire
: https://github.com/angular/angularfire/blob/master/docs/storage/storage.md#downloading-files
Есть идеи, что происходит не так?
обновление: Вероятно, это связано с этой проблемой: https://github.com/angular/angularfire/issues/2725
Комментарии:
1. Вы добавили
console.time
инструкции, чтобы проверить, действительно ли это было причиной проблемы?2. @David Регистрация непосредственно перед
this.storage.ref( solution.image ).getDownloadURL()
тем, как на самом деле работает так, как ожидалось. Но конечный результат не всегда своевременно подается в мой браузер. Однако без извлеченияthis.storage.ref( solution.image ).getDownloadURL()
этого не происходит.