寻找在React / Node中处理Excel文件上传并转换为带有其他表单数据的JSON的最佳做法。
要求:
将Excel数据转换为JSON,然后将JSON数据附加到其他表单数据中,然后再发送到MongoDB。
我还需要在生产中遍历NGINX,这可能是上传Excel文件时遇到的问题。没有NGINX,在Dev中就不是问题。
使用React / Redux和Node.js的Dev上当前有效的解决方案:
xlsx_buffer_json https://www.npmjs.com/package/xlsx_buffer_json
XLSX缓冲区JSON修复程序,用于缺少cptable引用:
必须将外部对象添加到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')
});
虽然这可行,但这并不是我心中最干净的解决方案。迄今为止,我还没有更好的解决方案。
有什么想法吗?