Следующий код должен работать.В облачной функции, запускаемой фоновым событием, вы должны вернуть обещание (или, в некоторых случаях, значение, например, return false;
).
Кроме того, поскольку вы несколько раз пишете в базу данных с помощью forEach()
вы не можете использовать метод set()
несколько раз по одной и той же ссылке, потому что вы будете перезаписывать каждую предыдущую запись.Вы должны использовать метод update()
(документ здесь ).
exports.sendBigQueryData =
functions.analytics.event('buy_from_shop').onLog((event) => {
const bigQuery = bigquery({ projectId: });
return bigQuery.query({ // <- here add a return
query: 'select email from table',
useLegacySql: false
}).then(function (results) {
console.log(results);
//.....
let updates = {};
const rows = results[0]; //get all fetched table rows
rows.forEach(function(row){ //iterate through each row
const newPostKey = admin.database().ref().child('BigQueryData').push().key;
updates['/BigQueryData/' + newPostKey] = {email:row['email']};
});
return admin.database().ref().update(updates); // <- we return a promise
}).catch(function (err) { // <- You have to catch the possible errors as well
console.log(err);
});
});
Наконец, я бы посоветовал вам посмотреть следующие два видео от команды Firebase, в которых подробно рассказывается, какДолжны быть написаны облачные функции, и в частности тот факт, что вы должны возвращать обещания:
https://www.youtube.com/watch?v=7IkUgCLr5oA
https://www.youtube.com/watch?v=652XeeKNHSk
Первый - больше о функциях HTTP, которыезапускаются через HTTP-запрос (т.е. не с фоновым событием), в то время как второй фокусируется на функциях, запускаемых фоновым событием, но рекомендуется просмотреть первый, прежде чем смотреть второй.