AngularUniversal无法从Firebase获取数据。
创始人
2024-10-29 21:01:24
0

使用Angular的TransferState模块来在服务器端和客户端之间传递数据。这样可以避免Firebase数据在服务器端已经被获取,但是在客户端还没有获取的情况。

在服务端代码中添加以下代码:

import 'rxjs/add/operator/do';
import { of } from 'rxjs/observable/of';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { map } from 'rxjs/operators/map';
import { AngularFireDatabase } from '@angular/fire/database';
import { TransferState, makeStateKey } from '@angular/platform-browser';

const dataKey = makeStateKey('my-data');

app.get('/', (req, res) => {
  const data = server.getSomeData(); // 从服务端获取数据

  const existingData = transferState.get(dataKey, null); // 从TransferState中获取数据,如果不存在则返回null

  if (existingData) {
    return of(existingData).subscribe(html => res.send(html)); // 如果已经存在数据,则直接返回
  } else {
    return fromPromise(firebase.getData()) // 如果不存在数据,则使用Firebase获取数据
      .pipe(
        map(data => {
          transferState.set(dataKey, data); // 将获取的数据存储到TransferState中
          return data;
        })
      )
      .subscribe(html => res.send(html)); // 最后返回数据
  }
});

在客户端代码中添加以下代码:

import 'rxjs/add/operator/take';
import { TransferState, makeStateKey } from '@angular/platform-browser';

const dataKey = makeStateKey('my-data');

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
  data: any;

  constructor(private transferState: TransferState, private db: AngularFireDatabase) {}

  ngOnInit() {
    const existingData = this.transferState.get(dataKey, null); // 从TransferState中获取数据,如果不存在则返回null

    if (existingData) {
      this.data = existingData; // 如果已经存在数据,则直接使用
    } else {
      this.db
        .object('/data')
        .valueChanges()
        .take(1) // 只获取一次数据
        .subscribe(data => {
          this.transferState.set(dataKey, data); // 将获取的数据存储到TransferState中
          this.data = data; // 最后使用数据
        });
    }
  }
}

相关内容

热门资讯

分享一款!xpoker辅助神器... 分享一款!xpoker辅助神器,wepoker辅助器激活码,科技教程(有挂软件)1、不需要AI权限,...
透视app!wepoker怎么... 透视app!wepoker怎么破解游戏(透视)一贯是真的有挂(详细辅助透牌教程);该软件可以轻松地帮...
必备科技!wepoker私人局... 必备科技!wepoker私人局透视插件,菠萝德州透视脚本,教你攻略(有挂透视)1、不需要AI权限,帮...
透视最新!有没有人wepoke... 透视最新!有没有人wepoker(透视)一直存在有挂(详细辅助细节揭秘);1、完成透视辅助安装,帮助...
重大通报!pokemmo脚本,... 重大通报!pokemmo脚本,hhpoker辅助器,解密教程(有挂透视);最新版2024是一款经典耐...
透视科技!wepoker透视脚... 透视科技!wepoker透视脚本是什么(透视)竟然有挂(详细辅助2025教程)1、完成wepoker...
终于清楚!wepoker免费脚... 终于清楚!wepoker免费脚本弱密码,wepokerplus作弊,靠谱教程(有挂攻略)1、不需要A...
透视ai代打!wepoker有... 透视ai代打!wepoker有没有挂(透视)总是是真的有挂(详细辅助力荐教程);1、玩家可以在软件透...
透视免费!来玩app 德州 辅... 透视免费!来玩app 德州 辅助(透视)原来是真的有挂(详细辅助介绍教程)1、游戏颠覆性的策略玩法,...
揭秘关于!哈糖大菠萝怎么挂,w... 揭秘关于!哈糖大菠萝怎么挂,werplan有挂吗,揭秘攻略(有挂攻略);玩家必备必赢加哟《13670...