Я пытаюсь выяснить, как записывать транзакции в базу данных firebase из углового приложения 6 / машинописного текста.
Один рабочий пример, который я использую в качестве руководства, следующий:
const transactions = [];
return db.runTransaction(function(transaction) {
// const promises = [];
descriptionsInDB.forEach(dbDescription => {
if (dbDescription.matched === false) {
// item wasn't found, so add the item to the transaction.
const phraseItem: PhrasesDB = {
query: dbDescription.description,
updatedAt: Date.now(),
createdAt: Date.now(),
workflows: {
[workflowId]: true
}
};
const newPhrasesRef = phrasesCol.doc();
transactions.push(transaction.set(newPhrasesRef, phraseItem));
} else {
if (dbDescription.data.workflows && dbDescription.data.workflows[workflowId]) {
// do nothing, this phrase is already part of the record.
} else { // update the workflows that are part of the record.
const workflows = {
workflows: {
[workflowId]: true
}
};
const phrasesRef = phrasesCol.doc(dbDescription.dbId);
transactions.push(transaction.update(phrasesRef, workflows));
}
}
});
return Promise.all(transactions);
})
Ключевые элементы, которые я определил, следующие:
1) Создайте массив для хранения ваших транзакций: const Transactions = [];
2) Начните транзакцию: return db.runTransactions (функция (транзакция) {…
3) Выполнить запрос к базе данных, используя транзакцию :action.set (newPhraseRef, фразуItem);
4) Передать транзакцию, возвращенную из запроса, вмассив транзакций: Transactions.push (Transactions.set (newPhraseRef, фразуItem));
5) Вернуть обещание с массивом транзакций: вернуть Promise.all (транзакция);
Если яимейте это право, тогда я смогу применить эту формулу к транзакции, которую я пытаюсь написать, и она должна работать:
const pendingRef = `Pending/${req.query.inviteId}`;
const acceptance = {
'cryptoInvitationAcceptance': req.body.cryptoInvitationAcceptance,
'reason': (req.body.reason !== undefined ? req.body.reason : '')
}
return db.runTransaction(function(t) {
const transArray = [];
const docRef = db.collection('Pending').doc(req.query.inviteId);
transArray.push(t.set(docRef, acceptance));
return Promise.all(transArray);
}).then(result => {
console.log('result = ', result);
}).catch(err => {
console.log('err = ', err);
});
Но она всегда идет в блок catch и выводит сообщение:
err = Ошибка: Вы должны вернуть Promise в своей транзакции () - обратный вызов.
Но Я ЕСМЬ возвращаю обещание, не так ли?Строка: return Promise.all (transArray) - это обещание, которое я возвращаю.Нет