Невозможно прочитать пропущенный идентификатор пустой базы - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь хранить данные в firebase, userId под списком.Это работает, но я получаю эту ошибку: typeerror не может прочитать свойство 'uid' null на service.ts, я новичок в этом Нужна помощь.

Здесь используется Uid, удаление его делает идентификатор пользователя неопределеннымна firebase при использовании выдает эту ошибку.Если я игнорирую ошибку и использую ее для добавления элемента, она работает нормально, но ошибка не исчезает.

private categoryListRef = this.db.list (categories-list/${this.currentUser.uid})

service.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import { Item } from '../models/item.model';
import * as firebase from 'firebase';

@Injectable()
export class CategoriesListService {

currentUser = firebase.auth().currentUser;

private categoriesListRef = this.db.list<Item>(`categories-list/${this.currentUser.uid}`)

constructor(private db: AngularFireDatabase) {
}

getCategoriesList() {
    return this.categoriesListRef;
}

addItem(item: Item) {
    return this.categoriesListRef.push(item);
}

editItem(item: Item) {
    return this.categoriesListRef.update(item.key, item);
}

removeItem(item: Item) {
    return this.categoriesListRef.remove(item.key);
}
}

home.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { CategoriesListService } from '../../services/categories-list.service';
import { Observable } from 'rxjs/Observable';
import { Item } from './../../models/item.model';

@IonicPage()
@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
})
export class HomePage {

categoriesList$: Observable<Item[]>

constructor(public navCtrl: NavController, public navParams: NavParams, private categories: CategoriesListService) {
this.categoriesList$ = this.categories
    .getCategoriesList() //DB List
    .snapshotChanges() // Key & Value
    .map(changes => {
        return changes.map(c => ({
            key: c.payload.key,
            ...c.payload.val()
        }));
    });
}


ionViewDidLoad() {
  console.log('ionViewDidLoad HomePage');
}

}

1 Ответ

0 голосов
/ 27 мая 2018

Кажется, простой ответ: ваш currentUser (все еще) равен нулю.Вот официальные документы к этому.

Ваша служба предполагает существование вошедшего в систему пользователя, но не проверяет, верно ли это предположение перед обработкой пользовательского объекта.Я считаю, что пользователь еще не полностью помещен / создан внутри firebase, когда ваш сервис уже пытается его получить.Расовые условия.

currentUser = firebase.auth().currentUser; // no validation whether the user exists.

Лучше попробуй так.

Ваше обслуживание

@Injectable()
export class CategoriesListService {

currentUser: any;
private categoriesListRef: any;

constructor(private db: AngularFireDatabase) {

    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        this.currentUser = user;
        categoriesListRef = this.db.list<Item>(`categories-list/${this.currentUser.uid}`)
      } else {
        // No user is signed in.
      }
    });

}

...  The rest of your code

Ваш home.ts

constructor(public navCtrl: NavController, public navParams: NavParams, private categories: CategoriesListService) {
    if(this.categories.getCategoriesList()) {
        this.categoriesList$ = this.categories
            .getCategoriesList() //DB List
            .snapshotChanges() // Key & Value
            .map(changes => {
                return changes.map(c => ({
                    key: c.payload.key,
                    ...c.payload.val()
                }));
            });
    }
}

Таким образом, вы можете убедиться, что пользователь существует.И только тогда процесс начинается.В противном случае система ничего не делает.Возможно, это не совсем то, что соответствует вашим потребностям в деталях, но это должно дать вам правильный совет, чтобы найти ваше окончательное решение.

...