Поиск рекомендаций по обработке загрузки файлов Excel в React / Node и преобразованию в JSON с дополнительными данными формы.
Требования:
- Сообщение включает в себяданные формы в дополнение к файлу Excel
- Обработка файла Excel на сервере с Node.js и Multer в памяти, т. е. multer.memoryStorage () (без сохранения файла на сервере)
Преобразование данных Excel в JSON, затем добавление данных JSON с дополнительными данными формы перед отправкой в MongoDB.
Мне также нужно будет обрабатывать данные через NGINX, что может быть проблемой при загрузке файла Excel.Не проблема в Dev без NGINX.
Текущее рабочее решение для Dev с React / Redux и Node.js:
- Fetch() для публикации на сервер
- Multer для обработки записи
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')
});
Хотя это работает, на мой взгляд, это не самое чистое решение.На сегодняшний день я не видел лучшего рабочего решения.
Есть мысли?