Node.js使用csv-parse时Buffer与CSV文件混淆问题排查
NestJS解析上传CSV文件报错问题
我在React应用上传CSV文件到NestJS后端时遇到错误,相关代码和日志如下:
控制器代码
@Post(':id/transactions/upload') @UseInterceptors(FileInterceptor('file')) uploadTransactions( @Body() body: any, @UploadedFile() file: Express.Multer.File, ) { return this.accountsUsersService.uploadTransactions(file.buffer); }
服务代码
async uploadTransactions(buffer) { console.log('### buffer', buffer); const readBuffer = buffer.toString(); console.log('### readBuffer', readBuffer); const csvData = []; createReadStream(buffer) // tried many things .pipe( parse({ delimiter: ';', }) .on('data', function (dataRow) { csvData.push(dataRow); }) .on('end', function() { console.log('### csvData', csvData) }) ) return 'uploaded transactions successfully'; }
控制台日志输出
### buffer <Buffer 61 6c 62 65 72 74 3b 74 65 73 74 0a 6a 6f 61 6e 61 3b 67 6f 6f 64 0a> ### readBuffer albert;test joana;good Error: ENOENT: no such file or directory, open 'albert;test joana;good '
上传的CSV文件内容
albert;test joana;good
问题原因与解决方案
错误原因
你把文件Buffer对象直接传给了createReadStream,但这个方法的参数要求是文件路径字符串,Node.js会把Buffer转成字符串后当作文件路径去读取,自然找不到对应文件,所以抛出ENOENT错误。
解决方案
方案1:从Buffer创建可读流
先导入Node.js的Readable模块,再用它把Buffer转换成可读流:
import { Readable } from 'stream'; async uploadTransactions(buffer) { const csvData = []; // 从Buffer生成可读流 Readable.from(buffer) .pipe( parse({ delimiter: ';', }) .on('data', (dataRow) => { csvData.push(dataRow); }) .on('end', () => { console.log('### csvData', csvData); }) ); return 'uploaded transactions successfully'; }
方案2:直接解析字符串(更简便)
既然已经能把Buffer转成字符串,直接将字符串传入parse即可,无需创建流:
async uploadTransactions(buffer) { const readBuffer = buffer.toString(); const csvData = []; parse(readBuffer, { delimiter: ';' }) .on('data', (dataRow) => { csvData.push(dataRow); }) .on('end', () => { console.log('### csvData', csvData); }); return 'uploaded transactions successfully'; }
内容的提问来源于stack exchange,提问作者AlbertMunichMar
相关产品推荐
相关产品推荐

