Данные загружаются из Firebase асинхронно, как и во многих современных веб-API. Это означает, что основной код продолжает выполняться, и ваша функция обратного вызова вызывается после загрузки данных.
Лучше всего это можно увидеть, добавив в свой код некоторые записи:
console.log("Before attaching listener");
await db.dbRef.child("posts").on('value', function (snap) {
console.log("Got data");
});
console.log("After attaching listener");
Когда вы запускаете этот код, вы получаете:
Перед подключением слушателя
После подключения слушателя
Получил данные
Вероятно, это не тот порядок, который вы ожидали. Но это полностью объясняет, почему ваш код не работает: к моменту запуска return temp
данные еще не были загружены, и temp
соответствует тому, что было до того, как вы начали загружать данные.
Решение состоит в том, чтобы не пытаться немедленно вернуть данные, а вернуть так называемое обещание данных. Поскольку ваша функция верхнего уровня уже помечена как async
, это простое изменение:
module.exports.getAllPosts = async () => {
return await db.dbRef.child("posts").on('value', function (snap) {
return snap.val();
});
};