使用Node / Express从Firebase读取数据

时间:2016-09-29 01:01:31

标签: node.js express firebase firebase-realtime-database

我是Node.JS / Express世界的初学者,所以我在这里寻求一些帮助,如何完成我想要的工作。

我有这个中间件,我正在从Firebase中的数据库中读取数据,并将此数据推送到一个对象数组中。我的问题是:我什么时候可以使用res.render来渲染视图并发送数据?因为我总是得到“无法在发送后设置标题”错误,而且我知道原因,我只是无法弄清楚解决这个问题的最佳方法。

exports.regulation = (req, res, next) => {
    const collisions = [];
    const collisionsRef = firebase.database().ref('/collisions').once('value').then((data) => {
        data.forEach((elem) => {
            // console.log(elem.val());
            const collision = {};
            collision.id = elem.getKey();
            collision.userId = elem.val().userId;

            const userRef = firebase.database().ref('/users/' + elem.val().userId).once('value').then((user) => {
                collision.user = user.val().name;
                collision.status = elem.val().status;
                collision.timestamp = elem.val().timestamp;

                collisions.push(collision);
                // console.log(collisions.length);
            }).catch((err) => {
                // next(err);
            });
        });

        // res.render('regulation', {collisions: collisions});    
    });
};

谢谢! :)

1 个答案:

答案 0 :(得分:1)

同步运行对firebase和res.render函数的请求。 Async.js library series function可用于同步运行函数。

const collisions = [];
function getData(callback) {

   const collisionsRef = firebase.database().ref('/collisions').once('value').then((data) => {
    data.forEach((elem) => {
        // console.log(elem.val());
        const collision = {};
        collision.id = elem.getKey();
        collision.userId = elem.val().userId;

        const userRef = firebase.database().ref('/users/' + elem.val().userId).once('value').then((user) => {
            collision.user = user.val().name;
            collision.status = elem.val().status;
            collision.timestamp = elem.val().timestamp;

            collisions.push(collision);
            // console.log(collisions.length);
        }).catch((err) => {
            // next(err);
        });
    });
    callback(null, 'one'); 
}

async.series([
    getData,
    function(callback) {
        res.render('regulation', {collisions: collisions});
        callback(null, 'two');
    }
]);