You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:54:24