Облачные функции с firestore не могут найти никаких данных - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в js и firestore (и всей экосистеме firebase)

Я хочу запросить данные с 2 полями где (account_id, device_id), но я всегда получаю «Документ не найден»

let selectQuery = admin.firestore().collection("devices");
    selectQuery.where("account_id", "==", context.auth.uid);
    selectQuery.where("device_id", "==", deviceId);

    selectQuery.get().then(function(doc) {
        if (doc.exists) {
            console.log("Document data:", doc.data());
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
        }
        return "asd";
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });

Я даже попытался удалить предложения where, однако данные все еще не могут быть найдены, но они есть:

enter image description here

Параметр из контекстаи данные // UID = UIDwFK2JVghw8XjVGqlEE0Uj09irGK2 // DEVICE_ID = 552cbe50f935de7a

В качестве запроса приведен полный код:

exports.authDevice = functions.https.onCall((data, context) => {
    if (!context.auth) {
        // Throwing an HttpsError so that the client gets the error details.
        throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
            'while authenticated.');
    }

    const deviceName = data.device_name;
    const deviceId = data.device_id;
    const isQR = data.is_qr;
    const uid = context.auth.uid;

    console.log("DEVICE NAME: " + deviceName);
    console.log("DEVICE ID: " + deviceId);
    console.log("is QR: " + isQR);
    console.log("UID: " + uid);

    admin.firestore().collection("devices")
        .where("account_id", "==", context.auth.uid)
        .where("device_id", "==", deviceId)
        .get().then(function(doc) {
        if (doc.exists) {
            console.log("Document data:", doc.data());
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
        }
        return "asd";
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });
});

Ответы [ 2 ]

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

После некоторой отладки я обнаружил, что он возвращает не один документ, а "QUERY SNAPSHOT", у которого метод пуст или имеет размер.

После изменения:

return admin.firestore().collection("devices").where("account_id", "==", context.auth.uid)
        .where("device_id", "==", deviceId).get().then((snapshot) => {
        snapshot.forEach((doc) => {
            console.log(doc.id, '=>', doc.data());
        });
        console.log("Empty: " + snapshot.empty);
        console.log("Size: " + snapshot.size);
        return "asd"
    })
        .catch((err) => {
            console.log('Error getting documents', err);
        });
0 голосов
/ 28 мая 2018

context.auth доступно только для функций, запускаемых в режиме реального времени.Из документации для параметра EventContext.auth :

Информация аутентификации для пользователя, который запустил функцию.Этот объект содержит свойства uid и token для аутентифицированных пользователей.Для получения более подробной информации, включая ключи токенов, см. Ссылку на правила безопасности.

Для неаутентифицированного пользователя это поле имеет значение null. Для типов событий, которые не предоставляют информацию о пользователях (все, кроме базы данных реального времени) или для пользователей с правами администратора Firebase, это поле не будет существовать.

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