Облачная функция Firebase. Firestore Триггер onWrite не работает должным образом при локальном тестировании. - PullRequest
0 голосов
/ 06 сентября 2018

Я тестирую запущенную Firestore облачную функцию Firebase локально в Node с помощью оболочки Firebase Functions.

При работе с триггером onWrite и передаче нового документа путем вызова updateMonth({foo:'new'}) из оболочки функций я не могу получить ссылку на новый документ.

exports.updateMonth = functions.firestore
.document('users/{userId}').onWrite((change, context) => {
    const document = change.after.exists ? change.after.data() : null;
    console.log("change.after.exists", change.after.exists)
    console.log("change.before.exists", change.before.exists)
    const oldDocument = change.before.data();
    console.log("Old:",oldDocument)
    return true
})

При вызове как до, так и после, чтобы эмулировать обновление документа updateMonth({before:{foo:'old'},after:{foo:'new'}}), он работает как положено. Однако, когда вызывается только с updateMonth({foo:'new'}), как до, так и после документов, кажется, не существует:

i  functions: Preparing to emulate functions.
Warning: You're using Node.js v8.4.0 but Google Cloud Functions only supports v6.11.5.
+  functions: hi
+  functions: helloWorld
+  functions: updateMonth
firebase > updateMonth({before:{foo:'old'},after:{foo:'new'}})
'Successfully invoked function.'
firebase > info: User function triggered, starting execution
info: change.after.exists true
info: change.before.exists true
info: Old: { foo: 'old' }
info: Execution took 20 ms, user function completed successfully

firebase > updateMonth({foo:'new'})
'Successfully invoked function.'
firebase > info: User function triggered, starting execution
info: change.after.exists false
change.before.exists false
Old: undefined
Execution took 2 ms, user function completed successfully

Я не уверен, как получить ссылку на создаваемый новый документ. Я ожидаю, что в этом случае изменение.after.exist будет истинным.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

После многих итераций оказывается, что решение было действительно простым. Чтобы успешно эмулировать создание нового документа, который будет запускать onWrite при локальной эмуляции облачного функционала с использованием оболочки функций firebase, вам необходимо явно предоставить свойство after, как в updateMonth({after:{foo:'newVal'}}):

firebase > updateMonth({after:{foo:'newVal'}})
'Successfully invoked function.'
firebase > info: User function triggered, starting execution
change.after.exists true
change.before.exists false
New: { foo: 'newVal' }
info: Execution took 291 ms, user function completed successfully

Документация по https://firebase.google.com/docs/functions/local-emulator#invoke_firestore_functions не раскрывает это явным образом, поэтому возникает путаница. Возможно, это может быть хорошим дополнением к firebase-tools функциям firebase: shell.

0 голосов
/ 06 сентября 2018

С помощью триггеров onWrite и onUpdate необходимо объявить состояние документа «до» и «после» во всех случаях. Вы не можете попытаться упростить API, опустив ключи «до» или «после». Попробуйте это, например, если вы просто хотите проверить создание документа:

updateMonth({
    after:{foo:'new'}
})

Кроме того, если у вас есть код, который заинтересован только в создании документа, вероятно, проще просто написать в триггере onCreate, чем пытаться выяснить состояние документа в onWrite. Лично я избегаю onWrite и использую остальные три, потому что они легче рассуждают о том, что изменение было фактически сделано.

...