# #angular #typescript #firebase #google-cloud-firestore
Вопрос:
Я создал угловой проект и подключил его к базе данных firestore. Я также создал пользователя, используя это.
Моя проблема в том, что я не могу извлечь данные из firestore и сохранить их локально.
файл appuser.ts
export interface User {
uid: string;
email?: string;
photoURL?: string;
displayName?: string;
drawings?: [{
id?: string;
canvasfile?: string;
shared?: boolean | false;
}];
файл component.ts
import { Component, OnInit, OnChanges, Input, SimpleChanges } from "@angular/core";
import { AuthService } from "../../services/auth.service";
import { User } from "../../models/appuser";
import { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from '@angular/fire/firestore';
import { map, catchError } from 'rxjs/operators';
@Component({
selector: "app-drawspace",
templateUrl: "./drawspace.component.html",
styleUrls: ["./drawspace.component.css"]
})
export class DrawspaceComponent implements OnInit {
constructor(private auth: AuthService, private afs:AngularFirestore) {}
public availableUsers: any;
users: any;
ngOnInit() {
this.fetchAvailableUsers()
}
fetchAvailableUsers() {
this.availableUsers = this.afs
.collection<User>('users')
.snapshotChanges()
.pipe(
map(docArray => {
return docArray.map(doc => {
let userss: User = {
uid: doc.payload.doc.id,
displayName: doc.payload.doc.data().displayName,
email: doc.payload.doc.data().email,
photoURL: doc.payload.doc.data().photoURL
};
return userss;
});
})
);
console.log("here see == ", this.availableUsers); // I get observable
console.log("here see == ", this.availableUsers); // I get object
}
}
когда я запускаю это,
Я получаю наблюдаемый тип, когда я пытаюсь console.log, он выдает мне [объект OBJECT], и я даже не могу использовать для него *ngFor.
Я новичок в angular и firebase firestore, пожалуйста, помогите мне получить пользовательские данные, которые я успешно сохранил.
Спасибо.
Комментарии:
1. Попробуйте войти в журнал консоли
this.availableUsers.length
, чтобы проверить, является ли то, что у вас есть, массивом или нет. И если вы хотите отобразить содержимое объекта в консоли, то регистрируйте только этот объект, не создавайте интерполяции, потому что в вашем случаеlog
метод вызывает.toString()
this.availableUsers
, поэтому вы получаете [объект Object]. Попробуйтеconsole.log(this.availableUsers)
и вернитесь с тем, что у вас есть 😉2. Я попробовал
console.log(this.availableUsers.length)
и получилundefined
.
Ответ №1:
JavaScript [объект Object] — это строковое представление объекта. Если вы хотите просмотреть содержимое, попробуйте console.log(JSON.stringify(thatObj))
fetchAvailableUsers() {
this.availableUsers = this.afs
.collection<User>('users')
.snapshotChanges()
.pipe(
map(docArray => {
const data = []
docArray.forEach(doc => {
let userss: User = {
uid: doc.payload.doc.id,
displayName: doc.payload.doc.data().displayName,
email: doc.payload.doc.data().email,
photoURL: doc.payload.doc.data().photoURL
};
data.push(userss)
});
console.log(data) //console.log(JSON.stringify(data))
^^^^
return data
})
);
Комментарии:
1. @Dharmaraj Спасибо за ваш ответ, но он выдает мне ошибку компиляции
error TS7034: Variable 'data' implicitly has type 'any[]' in some locations where its type cannot be determined.
вconst data = []
строке.2. @Аватар, пожалуйста, попробуйте
const data: any[] = []
3. @Dharmaraj Да, это решило ошибку компиляции, но консоль ничего не дает. Я думаю, что он не проходит через этот цикл, потому что я проверил его, сохранив общий журнал console.log, он ничего мне не показал.
4. @Avatar вы можете
console.log(docArray)
сделать это перед циклом for? Также попробуйтеdocArray.docs.forEach(..)
, например, цикл на.docs
свойстве.5. @Дхармарадж, который выдал ошибку
error TS2339: Property 'docs' does not exist on type 'DocumentChangeAction<User>[]'.
Ответ №2:
Я думаю, что проблема может заключаться в том, что JavaScript выполняет ваши инструкции синхронно, что означает, что он отправляет запрос в firebase и переходит к отображению списка пользователей, не дожидаясь получения результата запроса
Попробуйте отобразить список пользователей с помощью крана и дайте мне знать, если у вас что-то есть.
fetchAvailableUsers() {
this.availableUsers = this.afs
.collection<User>('users')
.snapshotChanges()
.pipe(
map(
// your mapping goes here...
),
tap(users => console.log(users))
);
}
Комментарии:
1. Эй, спасибо, но это ничего не выдает.
2. Давайте сделаем это шаг за шагом. Давайте убедимся, что некоторые данные действительно извлекаются из firebase. Возьмите весь код
fetchAvailableUsers()
и напишите внутри следующий фрагмент:this.afs.collection('users').snapshotChanges().subscribe(result => console.log(result));
Если что-то отображается, это означает, что мы можем перейти к части отображения 🙂3. Эй, у меня кое-что есть..
{…}] 0: {type: "added", payload: t} length: 1 [[Prototype]]: Array(0) [{…}] 0: {type: "modified", payload: {…}} length: 1 [[Prototype]]: Array(0) [{…}] 0: {type: "modified", payload: {…}} length: 1 [[Prototype]]: Array(0)