【发布时间】: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 解析器。