Не совсем понятно, что вы пытаетесь сделать, но у вас как минимум 2 проблемы:
Вы не должны напрямую звонить set()
на kittyRef
внутри транзакция - вы заблокировали объект, прочитав его внутри этой транзакции. Это нужно сделать с помощью вызова transaction.set()
. Вот почему вы получаете зависание.
Вызов (необработанного) исключения внутри транзакции приводит к , вызывая прерывание , так как это вызовет updateFunction
чтобы вернуть невыполненное обещание). Дополнительная документация здесь . Лучшим ответом здесь было бы передать информацию из функции транзакции и обработать ее после завершения транзакции.
Итак, этот код будет запущен, завершен и оставьте кошку помеченной как мертвую, но это не приведет к ошибке. Однако этого должно быть достаточно, чтобы вы начали:
console.log('Init the cat')
const kittyRef = admin.firestore()
.collection('cats')
.doc('kitty')
await kittyRef.set({
name: 'Kitty',
age: 85,
feedCount: 0,
})
console.log('Feeding the cat')
await admin.firestore().runTransaction(async transaction => {
const snapshot = await transaction.get(kittyRef);
const cat = snapshot.data()
if(cat.isDead) return
if(cat.age > 84) {
cat.isDead = true
await transaction.set(kittyRef, cat); // this need be written to the db
console.log('kitty now dead');
return;
}
cat.feeCount ++
await transaction.set(kittyRef, cat)
}, {maxAttempts: 5})
console.log('success')
Кроме того, я отмечаю, что у вас есть опечатка feeCount
вместо feedCount
, но это не связано с вашим текущим вопросом.