【问题标题】:Processing a csv file after swagger upload - No such file or directory大张旗鼓上传后处理csv文件-没有这样的文件或目录
【发布时间】:2019-06-30 08:19:45
【问题描述】:

我希望使用 swagger 上传 csv 文件,然后在我的 nodejs 应用程序中处理该文件,方法是遍历每一行。大摇大摆的部分相当直截了当,但我无法读取文件以处理数据。

我使用了下面的基本 swagger 示例,它可以很好地提供文件,但我不确定如何在后端处理它。

paths:
  /upload:
    post:
      summary: "Uploads a file."
      operationId: "uploadPOST"
      consumes:
      - "multipart/form-data"
      parameters:
      - name: "upfile"
        in: "formData"
        description: "The file to upload."
        required: false
        type: "file"
      responses:
        201:
          description: "An object with user details"
      x-swagger-router-controller: "Default"

然后我在后端有一个非常基本的功能:

const fs = require('fs'); 
const csv = require('csv-parser');

module.exports.uploadPOST = function uploadPOST (req, res, next) {

  var fileValue = req.swagger.params['upfile'].value;
  console.log(fileValue);

  fs.createReadStream(fileValue)
  .pipe(csv())
  .on('data', function(data){
    console.log(data);
  })
  .on('end',function(){
      console.log("Done")
  });  

};

当我记录收到的文件时:

{ fieldname: 'upfile',
  originalname: 'test.csv',
  encoding: '7bit',
  mimetype: 'application/octet-stream',
  buffer:
   <Buffer 63 6f 6c 75 6d 6e 5f 61 2c 63 6f 6c 75 6d 6e 5f 62 2c 63 6f 6c 75 6d 6e 5f 63 2c 63 6f 6c 75 6d 6e 5f 64 2c 63 6f 6c 75 6d 6e 5f 65 2c 63 6f 6c 75 6d ... >,
  size: 251 }

现在,当我尝试从“req.swagger.params['upfile'].value”读取流时,我收到以下错误:

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be one of type string, Buffer, or URL

所以我想也许我可以通过以下方式传入缓冲区值:“req.swagger.params['upfile'].value.buffer”,但后来我得到了错误:

Error: ENOENT: no such file or directory, open 'column_a,column_b,column_c,column_d,column_e,column_f
a1,b1,c1,d1,e1,f1
a2,b2,c2,d2,e2,f2
a3,b3,c3,d3,e3,f3
a4,b4,c4,d4,e4,f4
a5,b5,c5,d5,e5,f5
a6,b6,c6,d6,e6,f6
a7,b7,c7,d7,e7,f7
a8,b8,c8,d8,e8,f8
a9,b9,c9,d9,e9,f9
a10,b10,c10,d10,e10,f10
'

我将如何读取文件以便处理和循环数据?

【问题讨论】:

  • fs.createReadStream() 操作区域设置文件,因此fileValue 应该是文件系统中文件的路径。如果我理解正确,fileValue 是一个带有一些元数据的对象,并且在buffer 字段中有一个缓冲区。
  • 是的,我的逻辑在将其视为文件时可能存在缺陷,因为可能 swagger 现在已将其更改为对象,现在读取此对象的最佳方法是什么?我一直在谷歌搜索,但到目前为止还没有运气。
  • 也许一些答案here 可以提供帮助?或者你可以尝试找到一个使用缓冲区而不是流的 csv 解析器。

标签: node.js csv swagger fs


【解决方案1】:

所以我想错了。正如评论中提到的 fs.createReadStream() 特定于从文件中读取。由于 swagger 将文件转换为对象,因此需要使用不同的方法。

这是通过 csv 节点模块实现的。

npm install csv

然后像这样使用它

const csv = require('csv')

module.exports.uploadPOST = function uploadPOST (req, res, next) { 

  csv.parse(req.swagger.params['upfile'].value.buffer, function (err, data) {
    console.log(data);
  });


};

这又会将 csv 转换为数组数组

[ [ 'column_a', 'column_b', 'column_c', 'column_d', 'column_e', 'column_f' ],
  [ 'a1', 'b1', 'c1', 'd1', 'e1', 'f1' ],
  [ 'a2', 'b2', 'c2', 'd2', 'e2', 'f2' ],
  [ 'a3', 'b3', 'c3', 'd3', 'e3', 'f3' ],
  [ 'a4', 'b4', 'c4', 'd4', 'e4', 'f4' ],
  [ 'a5', 'b5', 'c5', 'd5', 'e5', 'f5' ],
  [ 'a6', 'b6', 'c6', 'd6', 'e6', 'f6' ],
  [ 'a7', 'b7', 'c7', 'd7', 'e7', 'f7' ],
  [ 'a8', 'b8', 'c8', 'd8', 'e8', 'f8' ],
  [ 'a9', 'b9', 'c9', 'd9', 'e9', 'f9' ],
  [ 'a10', 'b10', 'c10', 'd10', 'e10', 'f10' ] ]

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2017-03-04
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多