#javascript #firebase #google-cloud-functions
#javascript #firebase #google-cloud-функции
Вопрос:
Я пытаюсь разработать облачную функцию, которая принимает значение суммы, затем принимает итоговое значение и добавляет сумму к этому итогу, прежде чем переписывать итоговое значение с новой суммой.
пока это то, что у меня есть:
exports.newRequest = functions.database.ref("/aRef/{aUID}/{bUID}").onCreate((snapshot, context) =>{
var requestSnapshot = snapshot.data;
console.log('Testing stuff', context.params.aUID);
var UID= context.params.aUID;
var thisAmount= requestSnapshot.child('amount').val();
var totalAmount= functions.database.child('aRef').child('bRef').child(UID).child('totalAmount').val();
var finalAmount = totalAmount thisAmount;
return functions.database().ref(`aRef/bRef/${UID}/totalAmount`).set(finalAmount);
});
и это ошибка, которую я получаю:
TypeError: Cannot read property 'Id' of undefined
at exports.newRequest.functions.database.ref.onWrite.context (/user_code/index.js:14:44)
at cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:114:23)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:144:20)
at /var/tmp/worker/worker.js:827:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
Я понимаю, что ошибка приводит меня к строке 14, которая в данном случае пытается получить значение {Id}
, но не понимаю, как это исправить?
Ответ №1:
Ваше определение функции неверно. Он должен принимать первый параметр, который является моментальным снимком, и второй параметр, который является контекстом. То, что у вас есть прямо сейчас, выглядит так, как будто вы пытаетесь объединить оба объекта в один параметр с именем context
.
Возможно, вы захотите вернуться к документации и узнать о том, как работают триггеры перезаписи базы данных.
Комментарии:
1. спасибо за подсказку, но это не приводит к ответу
2. итак, я решил, что вызов onCreate лучше подходит для моего варианта использования, и включил (снимок, контекст), однако, context.params . aUID по-прежнему выдает ту же ошибку? Спасибо за помощь с этим, я не новичок в кодировании, но по какой-то причине JavaScript, кажется, выводит меня из себя.
Ответ №2:
Итак, после небольшого изучения и подсказки Дуга Стивенсона я неправильно вызывал / пытался получить данные из контекста, а не из моментального снимка, и пытался получить данные из другой области моей базы данных, не вводя .once().then() для извлечения моментального снимка. Мне также не нужен был метод onWrite, но метод onCreate.
Окончательный код ниже для всех, кому это нужно.
exports.onRequest = functions.database.ref("/Donations/{UID}").onCreate((snapshot, context) =>{
var requestSnapshot = snapshot.val();
var ID = snapshot.child('toid').val();
var thisAmount = snapshot.child('amount').val();
var database = admin.database().ref(`/users/charity/${ID}/acc/totalAmount`);
return database.once('value').then (snapshot =>{
var totalAmount = snapshot.val();
var finalAmount = totalAmount thisAmount;
console.log('status', snapshot.child('amount').val());
return database.set(finalAmount);
});
});