Nodejs читает файл с экспресс-страницы - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема, мне нужно прочитать CSV-файл с веб-страницы, разработанной с использованием Express.

В основном у меня есть

router.get('/metricas', function(req, res, next) {
  var datos= lee.leedatos();
  res.render('metricas', {page:'Metricas', menuId:'metricas',data:datos});
});

, а lee.leedatos () - этоследующее

exports.leedatos= function(){
    var datos;
    const csv =require('fast-csv')
    const stream =fs.createReadStream('mywebsite/book1.csv');
    const streamCsv=csv({
        headers:true,

    })
    .on('data',data=>{
        datos=data;
        //console.log(datos);
    })
    .on('finish',()=>{
        console.log('finished')
        console.log(datos)
        return datos;
    })
    stream.pipe(streamCsv);

}

Моя проблема в том, что веб-страница всегда возвращается до того, как файл будет прочитан вообще :( .. и data: datos всегда пуст.

Как мне сделатьзвонить синхронно?

Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

Вы можете использовать обратные вызовы / обещания для отслеживания выполнения асинхронного кода.Вот как код будет выглядеть с обещаниями:

router.get('/metricas', function(req, res, next) {
  var datos= lee.leedatos().then(() => {
      res.render('metricas', {page:'Metricas', menuId:'metricas',data:datos});
  });
});

exports.leedatos = function () {
  return new Promise((resolve, reject) => {
    var datos;
    const csv = require('fast-csv')
    const stream = fs.createReadStream('mywebsite/book1.csv');
    const streamCsv = csv({
      headers: true,
    }).on('data', data => {
      datos = data;
      //console.log(datos);
    }).on('finish', () => {
      console.log('finished')
      console.log(datos)
      resolve(datos);
    })
    stream.pipe(streamCsv);
  })
}

Вот ссылка на пост в блоге, который может помочь вам в понимании асинхронных функций: https://blog.risingstack.com/node-hero-async-programming-in-node-js/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...