Загрузка и чтение файла Excel в NodeJS

#node.js #multer

#node.js #мультер

Вопрос:

Мне нужно загрузить лист Excel и прочитать его в цикле, чтобы сохранить данные в базе данных. Мне нужно сделать это внутри моего пользовательского метода контроллера. Я использую multer, xlsx для того же.

Код для загрузки Excel:

 <form action="/file/upload" method="POST" encType="multipart/form-data">
    <input type="file" name="file" accept="*.csv" />
    <br/>
    <br/>
    <input type="submit" value="Submit" />
  </form>
  

Я должен выполнить обработку Excel в uploadData методе в FileController . Ниже приведен код в файловом контроллере:

 var bodyParser = require('body-parser');
var multer = require('multer');
var xlstojson = require("xls-to-json-lc");
var xlsxtojson = require("xlsx-to-json-lc");

var storage = multer.diskStorage({ //multers disk storage settings
  destination: function (req, file, cb) {
    cb(null, './public/uploads/')
  },
  filename: function (req, file, cb) {
    var datetimestamp = Date.now();
    cb(null, file.fieldname   '-'   datetimestamp   '.'   file.originalname.split('.')[file.originalname.split('.').length - 1])
  }
});
var upload = multer({ //multer settings
  storage: storage,
  fileFilter: function (req, file, callback) { //file filter
    if (['xls', 'xlsx'].indexOf(file.originalname.split('.')[file.originalname.split('.').length - 1]) === -1) {
      return callback(new Error('Wrong extension type'));
    }
    callback(null, true);
  }
}).single('file');

function uploadData(req, res) {
  var exceltojson;
  try {
    upload(req, res, function (err) {
      if (err) {
        res.json({ error_code: 1, err_desc: err });
        return;
      }
      /** Multer gives us file info in req.file object */
      if (!req.file) {
        res.json({ error_code: 1, err_desc: "No file passed" });
        return;
      }
      /** Check the extension of the incoming file and 
       *  use the appropriate module
       */
      if (req.file.originalname.split('.')[req.file.originalname.split('.').length - 1] === 'xlsx') {
        exceltojson = xlsxtojson;
      } else {
        exceltojson = xlstojson;
      }
      try {
        exceltojson({
          input: req.file.path,
          output: null, //since we don't need output.json
          lowerCaseHeaders: true
        }, function (err, result) {
          if (err) {
            return res.json({ error_code: 1, err_desc: err, data: null });
          }
          res.json({ error_code: 0, err_desc: null, data: result });
        });
      } catch (e) {
        res.json({ error_code: 1, err_desc: "Corupted excel file" });
      }
    })
  }
  catch (e) {
    console.log(e);
  }
}
  

Определили маршрут, как показано ниже

 'POST /file/upload': {
 controller: 'v1/FileController',
  action: 'uploadData'
},
  

Он переходит к uploadData методу в контроллере, но затем резко завершается. Не уверен, чего мне не хватает, но борюсь с последними несколькими часами. Я проверил много ссылок, но все предлагают делать все в app.js файле. Я новичок в Node и пытаюсь сопоставить примеры, доступные онлайн, чтобы делать что-то в методе контроллера. Любые указания будут высоко оценены.