Облачные функции, использующие подстановочный путь, не работают - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь обновить все документы в коллекции с помощью облачной функции. С этим кодом он работал для обновления одного документа (с идентификатором 0) в коллекции releaseQuestions:

exports.decreaseQuestionRestDuration = functions.https.onRequest((request, response) => {
   const test = admin.firestore().doc('releasedQuestions/0').update({restDuration: 42})
        .then(snapshot => {
            response.send(0)
        })
        .catch(error => {
            console.log(error)
            response.status(500).send(error)
        })
});

, но когда я обновлю все документы в коллекции с подстановочным путем, например:

const test = admin.firestore().doc('releasedQuestions/{qid}').update({restDuration: 42})

это не работает. Может ли кто-нибудь мне помочь?

Структура моего Cloud Firestore выглядит так: Структура Cloud Firestore

1 Ответ

2 голосов
/ 21 марта 2020

Синтаксис пути подстановочного знака, который вы используете (т. Е. doc('releasedQuestions/{qid}')), может использоваться только в облачных функциях definition , когда, например, вы определяете триггер Cloud Firestore, указывая путь к документу и событие введите, как показано ниже:

exports.useWildcard = functions.firestore
    .document('users/{userId}')
    .onWrite((change, context) => {...});

В вашем случае вы фактически вызываете метод doc(), для которого параметр documentPath должен быть string. Вот почему он работает в первом случае, но не во втором (в вашей коллекции нет документа Firestore с идентификатором {qid}).


Если вы хотите, в вашем HTTP Cloud Функция, чтобы обновить все документы коллекции, вы можете использовать пакетную запись следующим образом:

exports.decreaseQuestionRestDuration = functions.https.onRequest((request, response) => {

    const db = admin.firestore();

    db.collection('releasedQuestions').get()
        .then(snapshot => {
            let batch = db.batch();
            snapshot.forEach(doc => {
                batch.update(doc.ref, { restDuration: 42 });
            });
            return batch.commit()
        })
        .then(() => {
            response.send(0)
        })
        .catch(error => {
            console.log(error)
            response.status(500).send(error)
        })

});

Обратите внимание, что пакетная запись может содержать до 500 операций. Поэтому, если ваша коллекция содержит более 500 документов, вы можете вместо этого использовать Promise.all().


В качестве дополнительного примечания стоит отметить наличие литералов шаблона .

Литералы шаблона заключаются в символ обратной черты (серьезный акцент) вместо двойных или одинарных кавычек ... и могут содержать заполнители.

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