【问题标题】:No provider for AngularFireDatabase没有 AngularFireDatabase 的提供者
【发布时间】:2018-06-29 09:56:57
【问题描述】:

我正在关注tutorial 在 Angular 中设置聊天室应用程序,但在设置 AngularFire2 时遇到问题。

我注意到package.json file 使用4.0.0-rc.1,所以我将我的版本从"angularfire2": "^5.0.0-rc.4" 更改为"angularfire2": "^4.0.0-rc.1"

现在我的 chat.service.ts 导入看起来像这样

    import { Injectable } from '@angular/core';

    import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
    import { AngularFireAuth } from 'angularfire2/auth';

    import { Observable } from 'rxjs/Observable';
    import { AuthService } from '../services/auth.service';
    import * as firebase from 'firebase/app';

    import { ChatMessage } from '../models/chat.message.model';

但是我在 FirebaseListObservable 导入时遇到以下错误

当我用谷歌搜索这个错误时,我遇到了this post on github,它建议使用angularfire2/database-deprecated。我这样做了,我的项目现在编译没有任何错误。但是,当我现在导航到 localhost:4200/chat 时,它会将我的应用程序重定向到 http://localhost:4200/ 并且我在控制台中收到以下错误

当我用谷歌搜索这个错误时,最上面的结果是this SO post,它告诉我 AngularDatabase 已被分离到它自己的模块中。但我对如何解决我的问题感到困惑。我是否将他的整个示例复制到我的app.module.ts 文件中?我从哪里得到这个 AngularFireModule api 密钥?

我想尽可能紧跟本教程,我的 app.module.tsgithub tutorial has 以及完全相同的 chat.service.ts file 完全匹配,除了我的 'angularfire2/database-deprecated' 而不是 'angularfire2/database' .我从这里去哪里?这是我完整的 app.module.ts 文件

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

import { AngularFireModule } from 'angularfire2';
import { AngularFireDatabaseModule } from 'angularfire2/database';
import { AngularFireAuthModule } from 'angularfire2/auth';

import { AppComponent } from './app.component';
import { ChatFormComponent } from './chat-form/chat-form.component';
import { ChatRoomComponent } from './chat-room/chat-room.component';
import { MessagesFeedComponent } from './messages-feed/messages-feed.component';
import { MessageComponent } from './message/message.component';
import { LoginComponent } from './login/login.component';
import { SignupComponent } from './signup/signup.component';
import { NavigationComponent } from './navigation/navigation.component';
import { UserListComponent } from './user-list/user-list.component';
import { UserItemComponent } from './user-item/user-item.component';
import { ChatService } from './services/chat.service';
import { AuthService } from './services/auth.service';
import { appRoutes } from '../routes';
import { environment } from '../environments/environment';


@NgModule({
  declarations: [
    AppComponent,
    ChatFormComponent,
    ChatRoomComponent,
    MessagesFeedComponent,
    MessageComponent,
    LoginComponent,
    SignupComponent,
    NavigationComponent,
    UserListComponent,
    UserItemComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes),
    FormsModule,
    AngularFireModule,
    AngularFireDatabaseModule,
    AngularFireAuthModule,
    AngularFireModule.initializeApp(environment.firebase)
  ],
  providers: [AuthService, ChatService],
  bootstrap: [AppComponent]
})
export class AppModule { }

还有我的聊天服务文件

import { Injectable } from '@angular/core';

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database-deprecated';
import { AngularFireAuth } from 'angularfire2/auth';

import { Observable } from 'rxjs/Observable';
import { AuthService } from '../services/auth.service';
import * as firebase from 'firebase/app';

import { ChatMessage } from '../models/chat.message.model';


@Injectable()
export class ChatService {
  user: any;
  chatMessages:FirebaseListObservable<ChatMessage[]>;
  chatMessage: ChatMessage;
  userName: Observable<string>
  constructor(
    private db: AngularFireDatabase,
    private afAuth: AngularFireAuth
  ) {
    this.afAuth.authState.subscribe(auth =>{
      if(auth !== undefined && auth !== null){
        this.user = auth;
      }
    })
   }

  sendMessage(msg: string){
    const timestamp = this.getTimeStamp();
    const email = this.user.email;
    this.chatMessages = this.getMessages();
    this.chatMessages.push({
      message: msg,
      timeSent: timestamp,
      userName: this.userName,
      email: email
    });
    console.log('called sendMessage()!');
  }

  getTimeStamp(){
    const now = new Date();
    const date = now.getUTCFullYear() + '/' + (now.getUTCMonth() + 1) + '/' + now.getUTCDate();
    const time = now.getUTCHours() + ':' + now.getUTCMinutes()  + ':' + now.getUTCSeconds();

    return (date + ' ' + time);
  }

  getMessages(): FirebaseListObservable<ChatMessage[]>{
    return this.db.list('messages', {
      query: {
        limitToLast: 25,
        orderByKey: true
      }
    })
  }
}

【问题讨论】:

  • 修改import语句为AngularFireDatabaseModule.forRoot()

标签: angular angularfire2


【解决方案1】:

专门导入。使用相同的包导入相同的模块。 根据您的代码:

import { AngularFireDatabaseModule } from 'angularfire2/database';

你在服务中:

import { AngularFireDatabaseModule } from 'angularfire2/database-deprecated';

AngularFireDatabaseModule 分别从另外两个包“database”和“database-deprecated”导入。

【讨论】:

    【解决方案2】:

    在您导入的内容和使用的内容上保持一致

    确保您在所有地方都导入了相同的 Angularfire2 和 Firebase 包。从提供的快照看来,在 NgModule 中你可以这样做

    import { AngularFireDatabaseModule } from 'angularfire2/database';
    

    但在你做的服务中

    import { AngularFireDatabaseModule } from 'angularfire2/database-deprecated';
    

    使用最新的工作依赖项

    另外,您的 GitHub 存储库中的 package.json 看起来使用的是旧包,请更新。

    考虑其他选项 此外,您可能会考虑使用 Firestore 代替旧的实时数据库,但请注意,这是两个不同的东西,它们需要不同的实现。

    想法

    尝试使用 package.json 中的以下依赖项更新您的项目

      "dependencies": {
        "@angular/animations": "^5.2.0",
        "@angular/common": "^5.2.0",
        "@angular/compiler": "^5.2.0",
        "@angular/core": "^5.2.0",
        "@angular/forms": "^5.2.0",
        "@angular/http": "^5.2.0",
        "@angular/platform-browser": "^5.2.0",
        "@angular/platform-browser-dynamic": "^5.2.0",
        "@angular/router": "^5.2.0",
        "angularfire2": "^5.0.0-rc.5-next",
        "classlist.js": "^1.1.20150312",
        "core-js": "^2.5.3",
        "firebase": "4.8.0",
        "intl": "^1.2.5",
        "rxjs": "^5.5.6",
        "web-animations-js": "^2.3.1",
        "zone.js": "^0.8.20"
      },
      "devDependencies": {
        "@angular/cli": "^1.6.4",
        "@angular/compiler-cli": "^5.2.0",
        "@angular/language-service": "^5.2.0",
        "@types/jasmine": "^2.8.4",
        "@types/jasminewd2": "^2.0.3",
        "@types/node": "^9.3.0",
        "codelyzer": "^4.0.2",
        "jasmine-core": "^2.8.0",
        "jasmine-spec-reporter": "^4.2.1",
        "karma": "^2.0.0",
        "karma-chrome-launcher": "^2.2.0",
        "karma-cli": "~1.0.1",
        "karma-coverage-istanbul-reporter": "^1.3.3",
        "karma-jasmine": "^1.1.1",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "^5.2.2",
        "ts-node": "^4.1.0",
        "tslint": "^5.9.1",
        "typescript": "^2.6.2"
      }

    确实,“firebase”:“4.8.0”很重要。我添加的其余部分是 polyfills 和通用包的更新(如果您对最新的不稳定版本不满意,则不必使用它们)。你可以覆盖你的 package.json 然后运行 ​​npm install 。

    然后像这样简单地将 Firebase 导入您的主 AppModule:

    // General
    import { BrowserModule           } from '@angular/platform-browser';
    import { NgModule                } from '@angular/core';
    import { AppComponent            } from './app.component';
    
    // Firebase
    import { AngularFireModule       } from 'angularfire2';
    import { AngularFireAuthModule   } from 'angularfire2/auth';
    import { AngularFirestoreModule  } from 'angularfire2/firestore';
    import { environment             } from '../environments/environment';
    
    @NgModule({
      declarations : [
                   AppComponent,
                   ...
                 ],
      imports      : [
                   BrowserModule,
                   ...,
                   AngularFireModule.initializeApp(environment.firebase),
                   AngularFireAuthModule,
                   AngularFirestoreModule,
                   ...
                 ],
      providers    : [ ... ],
      bootstrap    : [ AppComponent  ]
    })
    export class AppModule { }

    如果需要,从 Firebase 添加所有相关模块(我只是将 Auth 和 Firestore 放在示例中)。

    你应该可以像这样在你的服务中使用它:

    import { Injectable                    } from '@angular/core';
    import { AngularFirestore,
             AngularFirestoreCollection,
             AngularFirestoreDocument      } from 'angularfire2/firestore';
    import * as firebase from 'firebase';
    
    @Injectable()
    export class SomeService {
    
      constructor( private _fireStore: AngularFirestore ) { }
                   
                   ... some code ...
    }

    【讨论】:

    • 我这样做并遇到了同样的问题
    • 只有 FirebaseListObservable 给您带来了麻烦,还是您还发现了其他问题?
    • 我看到的唯一问题是我在上面截屏时控制台中的错误。
    • 确保只从 "angularfire2": "^5.0.0-rc.5-next" 和 "firebase": "4.8.0" 导入任何地方
    • 当我这样做时,我在聊天服务中收到消息说“找不到名称 FirebaseListObservable”和“找不到名称 AngularFireDatabase”和“找不到名称 AngularFireAuth”。这是完整文件的样子。 pastebin.com/Tk4BfHYd
    猜你喜欢
    • 2017-10-02
    • 2018-04-03
    • 2018-05-22
    • 2017-08-13
    • 2012-07-07
    • 2018-08-11
    • 2017-06-04
    • 2018-04-24
    • 2017-03-01
    相关资源
    最近更新 更多