После создания документа в облачных функциях Firestore я хочу сделать запрос для получения совместимых документов, а затем отправить им уведомления.

Дополнительные объяснения:

  1. Документ создается на iOS. Он содержит город и тип.
  2. В CloudFunctions я обнаруживаю создание / обновление документа с помощью триггера onWrite.
  3. Я хочу запросить другие документы FireStore для пользователей, соответствующих критериям типа City +. Затем я хочу отправлять им уведомления.

Вот мой код:

exports.NewRequestCreated = functions.firestore.document('/Requests/{documentId}').onWrite(event => {
// Get an object with the current document value

var myRequest = event.data.data();

// Get an object with the previous document value (for update or delete)
// Note that previous will be null if no old value exists.
if (event.data.previous) {
  var oldDocument = event.data.previous.data();
}

//Get list of donors that can match this request
var compatibleTypesArray = getCompatibeUsers(myRequest.Type);
var matchingUsersArray = [];


var usersRef = functions.firestore.document('/Users');//functions.firestore.document('/Users');
var matchingUsersQuery = usersRef.where('city', '==', myRequest.city).where('type', '==', myRequest.type)
var user = matchingUsersQuery.get()
.then(snapshot => {
    snapshot.forEach(doc => {
        console.log(doc.id, '=>', doc.data());
    });
})
.catch(err => {
    console.log('Error getting documents', err);
});

});

Но это не удается из-за следующей ошибки в консоли функций:

TypeError: usersRef.where не является функцией при экспорте. export.NewRequestCreated Created.functions.firestore.document.onWrite.event (/user_code/index.js:45:40) в объекте. (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:59:27) в следующий (собственный) в /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71 в __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12) в cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:53:36) в / var / tmp / worker / worker.js: 695: 26 в process._tickDomainCallback (internal / process / next_tick.js: 135: 7)


person MNassar    schedule 30.11.2017    source источник
comment
В дополнение к ответу Дуга обратите внимание, что облачные функции, выполняющие асинхронную обработку (например, get()), должны возвращать Promise. Это объясняется в документации. Поскольку вы будете добавлять код для отправки сообщений FCM, что также является асинхронной операцией, вам также необходимо ознакомиться с цепочкой обещаний. Видео в связанных документах полезно.   -  person Bob Snyder    schedule 01.12.2017


Ответы (1)


usersRef - это DocumentReference. Как вы увидите в документации по API, для этого класса нет where() метода.

Возможно, вы хотели вместо этого получить объект CollectionReference с помощью collection (), который затем можно запрашивать документы, используя where ().

functions.firestore.collection('/Users');
person Doug Stevenson    schedule 30.11.2017