Облачная функция Firestore - получение объекта данных запроса в onUpdate / onCreate

При написании правил firebase вы можете получить доступ к данным запроса через request.resource.data. Это полезно, потому что вы можете посмотреть на природу запроса, чтобы определить его намерение, цель записи и разрешить или запретить. Это позволяет объединять свойства в объект в документе, принадлежащем пользователю, вместо использования вложенной коллекции документов.

Я хотел бы получить доступ к тем же данным запроса в обратных вызовах облачной функции update / write / и т. Д., Но я этого не вижу, и мне осталось провести сравнение объекта с change.before и change.after. Это не проблема, но я что-то упустил в документации?

Согласно документации: https://firebase.google.com/docs/firestore/extend-with-functions

exports.myFunctionName = functions.firestore.document('users/marie').onWrite((change, context) => {
   // ... the change or context objects do not contain the request data
});

person fionbio    schedule 01.08.2018    source источник
comment
Можете ли вы добавить свой код или какой-нибудь очень минималистичный пример, чтобы прояснить это?   -  person mark922    schedule 01.08.2018
comment
Мы также ищем то же самое, наш вариант использования - мы хотим знать, отправил ли клиент флаг в запросе или нет. Подробности ниже: мы хотим активировать некоторые функции, если клиент отправляет флаг в обновлении, если нет возможности получить фактический запрос, нам придется сбросить флаг после выполнения нашей логики, что приведет к дополнительной стоимости записи. Мы могли бы, конечно, иметь облачную функцию отдельно и позволить клиенту вызывать эту функцию, но мы бы хотели избежать этого, поскольку тогда нам также нужно будет позаботиться об отказоустойчивости.   -  person Tech Alpha Studios    schedule 04.10.2019


Ответы (1)


У меня возник тот же вопрос, когда я понял, что функция прослушивания обновлений была запускается независимо от обновляемого свойства, несмотря на 'status' in data проверку. Уловка в том, что данные представляют handler.after.data. Хотя мне не удалось получить доступ к данным запроса ни из handler, ни из context, я смог решить проблему, добавив дополнительную проверку, которая служит той же цели. А именно:

const dataBefore = handler.before.data();
const dataAfter = handler.after.data();

if (status in dataBefore && status in dataAfter) {
  if (dataBefore.status === 'unpublished' && dataAfter.status === 'published') {
    // handle update
  }
}
person Mateja Petrovic    schedule 06.08.2020