Загрузить файл Excel с помощью функции Fetch (), конвертировать в JSON в памяти - PullRequest
0 голосов
/ 12 декабря 2018

Поиск рекомендаций по обработке загрузки файлов Excel в React / Node и преобразованию в JSON с дополнительными данными формы.

Требования:

  • Сообщение включает в себяданные формы в дополнение к файлу Excel
  • Обработка файла Excel на сервере с Node.js и Multer в памяти, т. е. multer.memoryStorage () (без сохранения файла на сервере)
  • Преобразование данных Excel в JSON, затем добавление данных JSON с дополнительными данными формы перед отправкой в ​​MongoDB.

  • Мне также нужно будет обрабатывать данные через NGINX, что может быть проблемой при загрузке файла Excel.Не проблема в Dev без NGINX.

Текущее рабочее решение для Dev с React / Redux и Node.js:

  1. Fetch() для публикации на сервер
  2. Multer для обработки записи
  3. xlsx_buffer_json https://www.npmjs.com/package/xlsx_buffer_json

    Исправление JSON в буфере XLSX для отсутствующей ссылки cptable:

Пришлось добавить объект Externals в webpack.config:

       externals: [
         {
          './cptable': 'var cptable'
         },
       ]

Код реагирования

export function importAssets(assetData, importFile) {
    let systemAssetData = new FormData();
    systemAssetData.append('systemId', assetData.systemid);
    systemAssetData.append('productId', assetData.productid);
    systemAssetData.append('fileData', importFile);

    const config = {
        method: 'POST',
        headers: {'Accept':'application/json'},
        body: systemAssetData,
    };

   return (dispatch) => {
        dispatch(requestImportAsset(assetData));

        return fetch('/asset/importAssets', config)
            .then(response =>
                response.json().then(assets => ({assets, response})),
            ).then(({assets, response}) => {
                if (!response.ok) {
                    dispatch(requestImportAssetError(assets.message));
                    return Promise.reject(assets.message);
                }
                dispatch(requestImportAssetSuccess(assets));
                return 0;
            }).catch(err => console.log('Action Error: ', err)); 
    };
}

Узел / код экспресс-маршрута

var express = require('express');
var router = express.Router();
var requestpromise = require('request-promise');
var multer  = require('multer');
var xlsxtojson = require("xlsx_buffer_json")
var path = require("path");
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });

router.post('/importAssets', upload.single('fileData'),  (req, res) => {
    let config = req.app.get('config');
        try {
            xlsxtojson({
                input: req.file.buffer,
                output: null, 
                lowerCaseHeaders:true
            }, function(err,result){
                if(err) {
                    console.log('xlsxtojson error:  ' + err);
                    return res.json({error_code:1,err_desc:err, data: null});
                }
                result.push({"productid":req.body.productId});
                result.push({"systemid":req.body.systemId});
                
                //send result object JSON to API Server for insert into MongoDB
            });
        } catch (e){
            console.log('corrupt file error:  ' + e);
            res.json({error_code:1,err_desc:"Corupted excel file"});
        }
  res.status(200).send('Excel File Upload Succes')
});

Хотя это работает, на мой взгляд, это не самое чистое решение.На сегодняшний день я не видел лучшего рабочего решения.

Есть мысли?

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