Почему FireStore, где не работает запрос? - PullRequest
0 голосов
/ 30 августа 2018

FireStore where не работает или я делаю что-то не так. Я пытаюсь пользователю по электронной почте: tolotra@tolotra.com

Вот код:

const admin = require('firebase-admin');
var serviceAccount = require('../secret/nicecode-e3e53-2ddaa9d588ea.json');
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});
var db = admin.firestore();
const settings = {/* your settings... */ timestampsInSnapshots: true};
db.settings(settings);



function begin(email){
    return new Promise(function (res,rej){
        var ans

        var citiesRef = db.collection('users');
        var allCities = citiesRef.get()
            .then(snapshot => {
                snapshot.forEach(doc => {
                    console.log(doc.id, '=>', doc.data());
                });
            })
            .catch(err => {
                console.log('Error getting documents', err);
            });

        var citiesRef = db.collection('users');
        console.log(email)
        var query = citiesRef.where('email', '==', email).get()
            .then(doc => {
                if (!doc.exists) {
                    ans = {
                        "login_token": "7705cb58bbff3afa888a624747f8d1caaff08f6ed0dc465c7d2361fd62532bd7",
                        "next": "FAILURE",
                        "failure_step": {
                            "heading": "Error",
                            "description": "There is no account registered for "+email,
                            "actions": [{"label": "Sign up", "url": "/en/signup"}, {
                                "label": "Sign in",
                                "url": "/en/login"
                            }]
                        }
                    }

                } else {
                    console.log('Document data:', doc.data());
                    ans = {
                        "login_token": "cd01b73935b9262ac8a2bac3f81b6ed6ec78c15d3da5fc04f03879ebdd6931a9",
                        "next": "PASSWORD",
                        "password_step": {"heading": "Password", "description": "Enter your password", "error": ""}
                    }
                }
                res(ans)
            })
            .catch(err => {
                console.log('Error getting document', err);
            });
    })
}

begin('tolotra@tolotra.com').then(function (data) {
console.log(data)
})

Выводит это. (Обратите внимание, что пользователь с электронной почтой «tolotra@tolotra.com» будет найден, если я просто выберу всех пользователей)

tolotra@tolotra.com
{ login_token: '7705cb58bbff3afa888a624747f8d1caaff08f6ed0dc465c7d2361fd62532bd7',
  next: 'FAILURE',
  failure_step: 
   { heading: 'Error',
     description: 'There is no account registered for tolotra@tolotra.com',
     actions: [ [Object], [Object] ] } }
OqClQYBH8PWiNE2VF193 => { email: 'tolotra@tolotra.com',
  password_hash: 'E014231EF9830992D2E367231EEDE99C189B6518CE70E2AB8F414C784257751F' }

Вот моя база данных: enter image description here

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Когда вы запускаете запрос к Firestore, может быть несколько документов, соответствующих вашим условиям. Вот почему вы получаете не Document, а QuerySnapshot. И (в отличие от Document) QuerySnapshot не имеет метода exists(), но у него есть свойство empty, которое вы можете использовать.

Итак:

var query = citiesRef.where('email', '==', email).get()
    .then(querySnapshot => {
        if (querySnapshot.empty) {
            ans = {
                "login_token": "7705cb58bbff3afa888a624747f8d1caaff08f6ed0dc465c7d2361fd62532bd7",
                "next": "FAILURE",
                "failure_step": {
                    "heading": "Error",
                    "description": "There is no account registered for "+email,
                    "actions": [{"label": "Sign up", "url": "/en/signup"}, {
                        "label": "Sign in",
                        "url": "/en/login"
                    }]
                }
            }

        } else {
            var doc = querySnapshot.docs[0];
            console.log('Document data:', doc.data());
            ans = {
                "login_token": "cd01b73935b9262ac8a2bac3f81b6ed6ec78c15d3da5fc04f03879ebdd6931a9",
                "next": "PASSWORD",
                "password_step": {"heading": "Password", "description": "Enter your password", "error": ""}
            }
        }
        res(ans)
    })
    .catch(err => {
        console.log('Error getting document', err);
    });
0 голосов
/ 30 августа 2018

Проблема в том, что вы используете

.where('email', '==', email).get()

Что означает, что он собирается вернуть массив.

Однако, вы используете

!doc.exists

Который не существует на

.where

Вам нужно будет использовать

const query = firebase
  .firestore()
  .collection("users")
  .where("email", "==", email).get()
  .then(snapshot => {

    if (snapshot.empty) {
    // No Results
    }

    snapshot.docs.forEach(document => {
     if (document.exists) {
       // Do Something
     } else {
       // Do Something Else
     }
    })
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...