Firestore, где оператор с массивом не работает - PullRequest
0 голосов
/ 07 ноября 2018

Я проверяю в своей базе данных ссылку (которая существует), и я не возвращаю чаты, но не вижу, где.

chat.service.ts:

  getUserChats(): Observable<Chat[]> {
        let uid = '-1';
        this.auth.currUser.subscribe(user => (uid = user.uid));
        this.chats = this.afs
          .collection('chats', ref => ref.where('members', 'array-contains', `users/${uid}`))
          .snapshotChanges()
          .pipe(
            map(actions => {
              return actions.map(action => {
                const data = action.payload.doc.data() as Chat;
                const id = action.payload.doc.id;
                return {id, ...data};
              });
            })
          ) as Observable<Chat[]>;
        return this.chats;
      }

Код предназначен для получения всех чатов, в которых зарегистрированный пользователь является участником. Я делаю это, проверяя массив members, если есть какие-либо ссылки на него.

chat.component.ts:

chats: Observable<Chat[]>;
  constructor(private router: Router, public chatService: ChatService, public dialog: MatDialog, public auth: AuthService) { }

  ngOnInit() {
    this.chats = this.chatService.getUserChats();
  }

chat.component.html:

<mat-list-option *ngFor="let chat of chats | async" (click)="handleClick(chatList)" [value]="chat.id">
        <img matListAvatar src="./assets/avatar.svg" alt="Avatar Icon">
        <h3 mat-line>{{chat.name}}</h3>
        <p mat-line>test</p>
      </mat-list-option>

Структура чата:

model

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Я думаю, что вы вернете "this.chat" из сервиса до возвращения Observable с сервера. вам нужно вернуть наблюдаемую сам .... попробуйте это изменение:

getUserChats(): Observable < Chat[] > {
    let uid = '-1';
    this.auth.currUser.subscribe(user => (
            uid = user.uid;

            //that what you need to return
            return this.afs
                .collection('chats', ref => ref.where('members', 'array- 
                        contains ', `users/${uid}`))
                        .snapshotChanges()
                        .pipe(
                            map(actions => {
                                return actions.map(action => {
                                    const data = action.payload.doc.data() as Chat;
                                    const id = action.payload.doc.id;
                                    return { id,...data   };
                                });
                            })
                        ) as Observable < Chat[] > ;

                    }

                ));

каждому Наблюдаемому нужно подписаться - но в угловом асинхронном канале сделайте это за вас - так что вам просто нужно передать ему Наблюдаемое.

я редактирую свой ответ - теперь запрос ожидает ответа от пользователя auth

0 голосов
/ 07 ноября 2018

Значение '-1' будет найдено мгновенно, потому что я не жду, пока завершится пользовательская наблюдаемая, поэтому она ищет -1 и ничего не находит, поэтому мне приходится ждать пользовательской наблюдаемой. До сих пор не знаю, как вернуть внутреннюю наблюдаемую тогда.

0 голосов
/ 07 ноября 2018

По-видимому, вы запрашиваете users/uid, в то время как /users/uid хранится в вашей базе данных, см. Первый /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...