【问题标题】:connecting angular web app to firebase将 Angular Web 应用程序连接到 Firebase
【发布时间】:2017-09-27 17:34:49
【问题描述】:

我想将我的 web 应用程序连接到 firebase,并且我有 VPN,但是运行后,我的仪表板组件没有显示并且有一些错误:

发生错误:响应 app/hero.service.js:57 错误错误:node_modules/@angular/core/bundles/core.umd.js:1091 未捕获(承诺中):响应状态:404 Not Found for URL: https://myfirebase 数据库名称/.json

这是我的代码: 仪表板组件:

        import { Component, OnInit } from '@angular/core';
import {Http} from '@angular/http';
import { Hero }        from './hero';
import { HeroService } from './hero.service';


@Component({
  selector: 'my-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: [ './dashboard.component.css' ]
})
export class DashboardComponent implements OnInit {
  heroes: Hero[] = [];

  constructor(private heroService: HeroService) { }

  ngOnInit(): void {
    this.heroService.getHeroes()
      .then(heroes => this.heroes = heroes.slice(1, 5));

  }



}

hero.service.ts

          import { Injectable }    from '@angular/core';
import { Headers, Http } from '@angular/http';

import 'rxjs/add/operator/toPromise';

import { Hero } from './hero';

@Injectable()
export class HeroService {

  private headers = new Headers({'Content-Type': 'application/json'});
  private heroesUrl = private heroesUrl = "https://tour-of-heroes-bcc7b.firebaseio.com/.json";  // URL to web api

  constructor(private http: Http) { }

  getHeroes(): Promise<Hero[]> {
    return this.http.get(this.heroesUrl)
               .toPromise()
               .then(response => response.json().data as Hero[])
               .catch(this.handleError);
  }


  getHero(id: number): Promise<Hero> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.get(url)
      .toPromise()
      .then(response => response.json().data as Hero)
      .catch(this.handleError);
  }

  delete(id: number): Promise<void> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.delete(url, {headers: this.headers})
      .toPromise()
      .then(() => null)
      .catch(this.handleError);
  }

  create(name: string): Promise<Hero> {
    return this.http
      .post(this.heroesUrl, JSON.stringify({name: name}), {headers: this.headers})
      .toPromise()
      .then(res => res.json().data as Hero)
      .catch(this.handleError);
  }

  update(hero: Hero): Promise<Hero> {
    const url = `${this.heroesUrl}/${hero.id}`;
    return this.http
      .put(url, JSON.stringify(hero), {headers: this.headers})
      .toPromise()
      .then(() => hero)
      .catch(this.handleError);
  }

  private handleError(error: any): Promise<any> {
    console.error('An error occurred', error); // for demo purposes only
    return Promise.reject(error.message || error);
  }
}

index.html

  <!DOCTYPE html>
    <html>
  <head>
    <base href="/">
    <title>Angular Tour of Heroes</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="styles.css">

    <!-- Polyfills -->
    <script src="node_modules/core-js/client/shim.min.js"></script>

    <script src="node_modules/zone.js/dist/zone.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>

    <script src="systemjs.config.js"></script>
    <script>
      System.import('main.js').catch(function(err){ console.error(err); });
    </script>


  <body>
    <my-app>Loading...</my-app>
    <script src="https://www.gstatic.com/firebasejs/3.9.0/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/3.9.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.9.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.9.0/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.9.0/firebase-messaging.js"></script>

<script>
  // Initialize Firebase
  var config = {
    apiKey: "my firebase project apikey",
    authDomain: "my firebase projec domain name",
    databaseURL: "my firebase projec database name",
    projectId: "my firebase projec ID",
    storageBucket: "my firebase projec storage",
    messagingSenderId: "my firebase projec senderId"
  };
  firebase.initializeApp(config);
</script>


  </head>
  </body>
</html>

app.module.ts

     import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';
import { HttpModule }    from '@angular/http';

import { AppRoutingModule } from './app-routing.module';

// Imports for loading & configuring the in-memory web api
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemoryDataService }  from './in-memory-data.service';

import { AppComponent }         from './app.component';
import { DashboardComponent }   from './dashboard.component';
import { HeroesComponent }      from './heroes.component';
import { HeroDetailComponent }  from './hero-detail.component';
import { HeroService }          from './hero.service';
import { HeroSearchComponent }  from './hero-search.component';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    InMemoryWebApiModule.forRoot(InMemoryDataService),
    AppRoutingModule
  ],
  declarations: [
    AppComponent,
    DashboardComponent,
    HeroDetailComponent,
    HeroesComponent,
    HeroSearchComponent
  ],
  providers: [ HeroService ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

【问题讨论】:

  • 问题出在这里-private heroesUrl = "https://my firebase database name/.json";
  • 这里应该是您在 firebase 中的数据库的真实网址
  • 非常感谢。我真正的鳕鱼是:私人英雄Url = "tour-of-heroes-bcc7b.firebaseio.com/.json";但它不起作用。

标签: javascript json node.js angular firebase


【解决方案1】:

尝试更新网址heroesUrl = "https://tour-of-heroes-bcc7b.firebaseio.com/.json"

【讨论】:

    【解决方案2】:

    首先,我看到你使用了InMemoryWebApi。您需要从NgModule 中删除以下行,它会干扰您的“真实”http 请求。所以从NgModule 中删除以下行:

    InMemoryWebApiModule.forRoot(InMemoryDataService)
    

    然后注意你的服务中额外的private heroesUrl

    private heroesUrl = private heroesUrl = "https://tour-of-heroes-bcc7b.firebaseio.com/.json"; 
    

    应该是:

    private heroesUrl = "https://tour-of-heroes-bcc7b.firebaseio.com/.json";
    

    接下来你的getHeroes 函数在你的服务中。您收到的 JSON 是一个数组,因此您的响应中没有对象 data 包含您要查找的数组,因此请更改:

    .then(response => response.json().data as Hero[])
    

    .then(response => response.json() as Hero[])
    

    我想我已经查明了错误(希望如此)。这里有一点

    Demo


    更新:

    新的错误slice is not a function是由于你改变了请求的url,所以数据改变了,现在我们不再处理一个数组,而是一个对象的对象。因此,您需要创建一个循环并提取每个对象并将它们推送到您的 heroes 数组。因此,您的订阅将如下所示:

    this.heroService.getHeroes()
      .then(data => {
        // iterate the object and push each object from inside that object to your array
        for(let obj in data) {
          this.heroes.push(data[obj])
        }
        console.log(this.heroes)
        this.heroes = this.heroes.slice(1, 5)
      });
    

    Demo

    【讨论】:

    • 嗨。谢谢。当我更改代码时出现另一个错误:node_modules/@angular/core/bundles/core.umd.js:1091 错误错误:未捕获(承诺):TypeError: heros.slice is not a function TypeError: heros.slice is not a function at eval (app/dashboard.component.js:22) at ZoneDelegate.invoke (zone.js:365) at Object.onInvoke (node_modules/@angular/ core/bundles/core.umd.js:4132) 你能帮帮我吗?
    • 你能用你的代码 fork the plunker,让我看看吗?
    • 我在这里看不到分叉版本...?最后一次更新 2 天前...plnkr.co/edit/gkFunf5C2o78RCWyWSMQ?p=preview 请检查一下,我会看看 :)
    • 你是对的。我犯了一个错误。我做了一个新的plunker。 plnkr.co/edit/58HIbbkYulBl5KBd9h7F?p=preview
    • 我更新了我的答案,请求是另一个 url,并且数据的形状与第一个 url 不同。但现在它应该可以工作了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多