2016-08-21 2 views
0

У меня есть приложение NodeJS, где я использую ExcelJS на одном из маршрутов (на основе Express). В следующем фрагменте простой цикл должен считывать строки из файла Excel, а затем вставлять их в массив. Однако, похоже, они не вставляются.Значения не вставлены в массив

router.get('/work', function(req, res, next) { 
    var posts = []; 
    var workbook = new Excel.Workbook(); 
    workbook.xlsx.readFile(file).then(function() { 
     var worksheet = workbook.getWorksheet(1); 
     worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) { 
      console.log(JSON.stringify(row.values)); 
      posts.push(JSON.stringify(row.values)); 
     }); 
    }); 
    res.json(posts); 
}); 

Это console.log линия работает просто отлично, так как я могу увидеть значение в консоли, как они вошли. Однако значения просто не вставлены в массив posts по какой-либо причине. Кто-нибудь знает почему?

ответ

6

Поскольку эта операция является асинхронной, вам необходимо отправить массив обратно после того, как вы закончили чтение вашего CSV:

router.get('/work', function(req, res, next) { 
    var posts = []; 
    var workbook = new Excel.Workbook(); 
    workbook.xlsx.readFile(file).then(function() { 
     var worksheet = workbook.getWorksheet(1); 
     worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) { 
      console.log(JSON.stringify(row.values)); 
      posts.push(JSON.stringify(row.values)); 
     }); 
     res.json(posts); // moved within the callback to `then` 
    }); 
}); 

Раньше вы были немедленно завершение запроса с вашим пустым массивом, прежде чем обещание, возвращенным readFile разрешено и разрешено заполнять его значениями из CSV.

+0

Спасибо за ваш ответ, однако я не уверен, что вы изменили в коде выше. Кажется, это похоже на мое. Если это было сделано специально, не могли бы вы привести пример того, что вы предлагаете? – DemCodeLines

+2

@DemCodeLines это не идентично, но определенно трудно определить визуально. Я добавил комментарий, который (надеюсь) разъясняет вещи –

+0

Спасибо, теперь это имеет смысл. – DemCodeLines