【问题标题】:How can I parse a javascript object returned by multer?如何解析 multer 返回的 javascript 对象?
【发布时间】:2019-01-17 11:15:57
【问题描述】:

我正在尝试使用 multer 以快递方式处理 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 返回的对象的 sn-p:

{"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 一起使用将不起作用,因此我将其注释掉。现在,我没有得到正文对象、文件对象或文件对象。我尝试使用 upload.none() 并在请求中发送相同的文件,看看我是否可以让它出错并显示消息“LIMIT_UNEXPECTED_FILE”,但它没有,所以看起来 multer 甚至没有识别出一个文件正在发送。我正在 Postman 中对此进行测试,内容类型设置为 false,正文为二进制文件,并附有文件。尝试以这种方式测试请求有什么问题吗?

【问题讨论】:

  • {"UPC,Price,SKU,Title\r\n…RED 100'\r"} 不是有效对象。像{"abc"} 一样,它缺少键后的值——一个对象看起来像{"abc": "def"}。你究竟是如何得到 multer 返回的那个对象的?如果你运行typeof thatValue,JavaScript 会说值是对象还是字符串?
  • @Rory O'Kane,我同意,这就是我的绊脚石,但这是我在 console.log(req.body) 时得到的。如果我调用 typeof,它会说对象,但我想不出任何可以检索其中数据的普通对象方法!

标签: javascript node.js csv express multer


【解决方案1】:

在 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()
});

【讨论】:

  • 如果我 console.log req.file,它会出现未定义。我对 multer 文档的理解是 req.file/files 会为非文本文件填充,但对于纯文本文件,唯一填充的是 req.body
  • Req.body 包含文件中的文本,但它的形式我无法使用它(据我所知)
  • 在我使用 bodyParser 之前。我在另一个问题中看到将 bodyParser 与 multer 一起使用将不起作用,因此我将其注释掉。现在,我没有得到正文对象、文件对象或文件对象。我尝试使用 upload.none() 并在请求中发送相同的文件,看看我是否可以让它出错并显示消息“LIMIT_UNEXPECTED_FILE”,但它没有,所以看起来 multer 甚至没有识别出一个文件正在发送。我正在使用 Postman,内容类型设置为 false,正文为二进制文件,附加文件。尝试以这种方式测试请求有什么问题吗?
  • 我可能是错的,但我的理解是 multer 用于多部分表单数据。您可以尝试将内容类型更新为multipart/form-data 吗?在正文选项卡中,应该有一个可以选择的form-data 单选按钮选项。然后,您应该能够在 Key 下拉菜单中选择 file 选项并上传您的文件。这是显示此内容的屏幕截图的链接:user-images.githubusercontent.com/29592177/…。在邮递员中更新您的请求后,您应该获得文件对象。让我知道这是否有帮助。
  • 我不再尝试在 Postman 中进行测试,而是从我的实际客户端开始对其进行测试,现在它可以正常工作了。我认为您是对的,可能是通过邮递员发送的编码问题。现在我知道未来了。谢谢!
猜你喜欢
  • 2020-01-29
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多