Обработка CSV-файла после загрузки Swagger - Нет такого файла или каталога - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу использовать swagger для загрузки файла CSV, а затем обработать файл в моем приложении nodejs, просматривая каждую строку.Часть swagger довольно прямолинейна, но я не могу прочитать файл, чтобы иметь возможность обрабатывать данные.

Я использовал приведенный ниже базовый пример 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
'

Как мне поступить при чтении файла, чтобы яможно обрабатывать и циклически перебирать данные?

1 Ответ

0 голосов
/ 07 февраля 2019

Так что я думал об этом неправильно.Как упомянуто в комментарии, 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' ] ]
...