У меня данные Firestore структурированы следующим образом:
Я хочу запуститьTransaction () для дочернего элемента trend_score. Моя функция работала до добавления второго .then (result =>, что означает, что теперь, когда я добавил еще один метод к облачной функции, я получаю сообщение об ошибке:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
exports.handler = functions.firestore.document('/Polls/{pollId}/responses/{userId}').onCreate((data, context) => {
const answerSelected = data.data().answer;
const answerRef = admin.firestore().doc(`Polls/${context.params.pollId}/answers/${answerSelected}`);
const voteCountRef = admin.firestore().doc(`Polls/${context.params.pollId}`);
const trendScoreRef = admin.firestore.doc(`Polls/${context.params.pollId}/trend_score`);
return admin.firestore().runTransaction(t => {
return t.get(answerRef)
.then(doc => {
if (doc.data()) {
t.update(answerRef, { vote_count: doc.data().vote_count + 1 });
}
})
}).then(result => {
return admin.firestore().runTransaction(t => {
return t.get(voteCountRef)
.then(doc => {
if (doc.data()) {
t.update(voteCountRef, {vote_count:doc.data().vote_count+1});
}
});
});
//starting with this set, I believe this code has caused the issue
}).then(result => {
return admin.firestore().runTransaction(t => {
return t.get(trendScoreRef)
.then(doc => {
if (doc.data()) {
t.update(trendScoreRef, {trend_score:doc.data().trend_score+1});
}
});
});
});
Error
1 problem (1 error, 0 warnings)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! functions@ lint: `eslint .`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the functions@ lint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/troychuinard/.npm/_logs/2018-11-10T02_02_56_229Z-debug.log
Error: functions predeploy error: Command terminated with non-zero exit code1
[1]: https://i.stack.imgur.com/etVwy.png
Понятно, поэтому вместо того, чтобы добавлять дополнительные обратные вызовы, я должен просто добавить еще один t.update в конец первого обратного вызова? Или передовой опыт был бы отдельной функцией? По сути, я хочу обновить 2 места с помощью 1 метода
Просто добавьте его как еще один then в цепочку, как показано в дубликате.
Разве я не этим занимался по сути?
Нет, у вас есть вложенные обратные вызовы thenвнутри, другие then, а не после их.
На самом деле это может не быть проблемой для транзакций. Не могли бы вы внимательно изучить сообщение об ошибке eslint, которое вы здесь не показывали, и обновить свой вопрос, включив его /
Возможно, мне не хватало кронштейна
Да, и если вы добавите это, держу пари, вы получите больше за обещание / отсутствие вложенности.
Позвольте нам продолжить обсуждение в чате.





После устранения синтаксической ошибки eslint предупреждает вас, что у вас есть вложенные обещания. Обычно это нехорошо, но поскольку они вложены в обратный вызов транзакции, на самом деле здесь нет проблемы. Вы можете отключить это предупреждение в строке, где его находит eslint, добавив этот комментарий в конец строк, о которых он вас предупреждает:
return t.get(answerRef) // eslint-disable-line promise/no-nesting
.then(...)
В вашем вопросе не отображается весь соответствующий вывод с консоли, но я могу сказать вам прямо сейчас, что eslint жалуется, что у вас есть вложенные обратные вызовы
then, что считается плохим стилем и подвержено ошибкам.