Ошибка обновления другого документа коллекции с помощью облачной функции - PullRequest
0 голосов
/ 03 февраля 2019

Используя облачные функции, при редактировании документа из коллекции "users" отредактированные файлы должны обновляться в коллекции uploads, где хранится идентификатор пользователя.

Для вышеуказанного требования я используюфункция ниже.

const functions = require('firebase-functions');

const admin = require('firebase-admin');

const settings = {
    timestampsInSnapshots: true
};

admin.initializeApp();

admin.firestore().settings(settings);

var db = admin.firestore();

exports.updateUser = functions.firestore.document('users/{userId}')
    .onUpdate((change, context) => {
        var userId = context.params.userId;

        const newValue = change.after.data();

        const name = newValue.display_name;

        var uploadsRef = db.collection('uploads');

        uploadsRef.where('user.id', '==', userId).get().then((snapshot) => {
            snapshot.docs.forEach(doc => {
                doc.set({"display_name" : name}); //Set the new data
            });
        }).then((err)=> {
            console.log(err)
        });

    });

Когда это выполняется, я получаю в журналах ошибку ниже.

TypeError: doc.set is not a function
    at snapshot.docs.forEach.doc (/user_code/index.js:31:21)
    at Array.forEach (native)
    at uploadsRef.where.get.then (/user_code/index.js:29:27)
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

А также ниже.

Unhandled rejection

Какмне подойти к проблеме?Каков наилучший подход к обновлению документов моментальных снимков?

1 Ответ

0 голосов
/ 03 февраля 2019

Когда вы делаете get () на Query объекте, это приведет к QuerySnapshot объекту.Когда вы используете его свойство docs, вы выполняете итерацию массива QuerySnapshotDocument объектов, которые содержат все данные из соответствующих документов.Похоже, вы предполагаете, что объект QuerySnapshotDocument имеет метод set (), но из связанных документов API видно, что его нет.

Если вы хотите выполнить обратную запись в документ, указанный вQuerySnapshotDocument, используйте его свойство ref , чтобы получить DocumentReference объект, который имеет , имеет set () метод.

doc.ref.set({"display_name" : name}); //Set the new data

Помните, что если вы сделаете это изменение, оно запустится, но не сможет обновить все документы, потому что вы также игнорируете обещание, возвращаемое методом set ().Вам нужно собрать все эти обещания в массив и использовать Promise.all (), чтобы сгенерировать новое обещание для возврата из функции.Это необходимо для того, чтобы облачные функции знали, когда вся асинхронная работа завершена.

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