使用Fetch()上载Excel文件上传到内存中的JSON

时间:2018-12-12 19:13:34

标签: javascript node.js excel reactjs multer

寻找在React / Node中处理Excel文件上传并转换为带有其他表单数据的JSON的最佳做法。

要求:

  • 帖子除Excel文件外还包括表单数据
  • 使用内存中的Node.js和Multer处理服务器上的Excel文件,即multer.memoryStorage()(不将文件保存到服务器)
  • 将Excel数据转换为JSON,然后将JSON数据附加到其他表单数据中,然后再发送到MongoDB。

  • 我还需要在生产中遍历NGINX,这可能是上传Excel文件时遇到的问题。没有NGINX,在Dev中就不是问题。

使用React / Redux和Node.js的Dev上当前有效的解决方案:

  1. 提取()以发布到服务器
  2. 处理帖子的狂人
  3. 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')
});

虽然这可行,但这并不是我心中最干净的解决方案。迄今为止,我还没有更好的解决方案。

有什么想法吗?

0 个答案:

没有答案