2016-09-29 1 views
1

Я новичок в мире Node.JS/Express, поэтому я здесь, чтобы попросить о помощи, в том, как выполнить то, что я хочу.Чтение данных с Firebase с помощью Node/Express

У меня есть это промежуточное программное обеспечение, которое я читаю данные из моей базы данных в Firebase и перетаскивая эти данные в массив объектов. Моя проблема: когда я могу использовать res.render, чтобы отобразить представление и отправить данные? Потому что я всегда получаю сообщение «Can not set headers after they are sent», и я знаю причину, я просто не могу понять, как лучше всего это решить.

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

Запрос функций 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'); 
    } 
]); 
Смежные вопросы