代码之家  ›  专栏  ›  技术社区  ›  adam tropp

如何解析multer返回的javascript对象?

  •  0
  • adam tropp  · 技术社区  · 6 年前

    我试图使用multer在express中处理csv文件的上传,然后逐行解析文件。我可以将文件作为包含在req.body中的对象获取,但是我无法解析它,因为它现在看起来只是一个对象,不再是csv字符串。如何从上传的文件中单独获取每一行? (应用程序/索引):

    const csv = require('csvtojson');
    const multer  = require('multer');
    const upload = multer();
    
    router.post('/distributor/:id/upload', upload.single(), function (req, res, 
    next) {
      req.setTimeout(600000);
      console.log(req.body) 
      next()
    }, function (req, res, next) {
        //calling req.body here returns an object with \r between each line from 
        file, but I cannot seem to parse each line
        res.end();
    }) 
    

    我试图在第二个函数中使用csvtojson,如下所示:

     csv()
    .fromString(req.body.toString(UTF8))
    .subscribe((csvLine)=>{
        console.log(csvLine); 
    } 
    

    但这只是试图解析整个对象,而不是其中的每一行。以下是multer返回的对象片段:

    {"UPC,Price,SKU,Title\r\n043171884536,1.17,538397,ORANGE YARN EGGS SIZE 4 - 
    4 PK\r\n043171080044,1.39,942227,MIKE'S YELLOW/CORN GLO 
    BAIT\r\n035011000046,1.98,161687,REPLACEMENT BRAKE 
    PADS\r\n056389001503,1.79,41582,FIRE 
    LIGHTERS\r\n087837005156,5.04,266320,PLATINUM GREEN 1/4LB SPOOL 
    25#\r\n046295070045,1.54,604652,MIKE'S GARLIC GLO-SCENT 
    OIL\r\n043171660161,1.02,126011,THREAD  RED 100'\r"} 
    

    在我使用bodyParser之前编辑**。我在一个问题中看到,将bodyParser与multer结合使用是行不通的,因此我将其注释掉。现在,我没有一个body对象,或者一个file对象,或者一个files对象。我试着使用upload.none()并在请求中发送同一个文件,以查看是否可以通过消息“LIMIT_UNEXPECTED_file”使其出错,但它没有,所以看起来multer甚至不知道正在发送文件。我在Postman中对此进行测试,内容类型设置为false,正文为二进制,附带一个文件。这样测试请求有什么问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   willascend    6 年前

    在multer文档提供的示例中,req.body对象将包含表单中的文本字段,req.file将包含上载的文件:

    app.post('/profile', upload.single('avatar'), function (req, res, next) {
      // req.file is the `avatar` file
      // req.body will hold the text fields, if there were any
    })
    

    你试过用 file 反对?大致如下:

    router.post('/distributor/:id/upload', upload.single(), function (req, res, next) {
      req.setTimeout(600000);
      console.log(req.body)
      console.log(req.file)
      csv()
      .fromFile(req.file.path)
      .then((jsonObj)=>{
        console.log(jsonObj);
        //loop through array of objects here
      }) 
      next()
    });