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

无法将Buffer写入文件:写入内容仍为JSON格式的问题排查

问题

我尝试从参数中获取ImportDto,将其转换为Buffer数据后写入文件,但文件中仍以JSON格式存储数据,请问问题出在哪里?

相关代码如下:

async import(dto: ImportDto, veritabaniId: number): Promise<Buffer> {
const quadDto = new QuadBulkCreateDto();
quadDto.quads = JSON.parse(dto.file.data);

try {
  await validate(quadDto);
  const dirPath = join(envConfig.quadsDataPath, veritabaniId.toString());
  const filePath = join(dirPath, 'quad_data.json');

  await fs.promises.mkdir(dirPath, { recursive: true });

  const binaryFile = Buffer.from(JSON.stringify(quadDto.quads));

  await fs.promises.writeFile(filePath, binaryFile);

  const fileData = await fs.promises.readFile(filePath);

  return fileData;
} catch (error) {
  throw error;
}
原因分析与解决办法
  • 核心问题:Buffer是字节容器,不改变数据内容格式
    你用Buffer.from(JSON.stringify(quadDto.quads))只是把JSON字符串转换成了字节形式的Buffer,但这些字节本质还是JSON字符串的二进制编码,写入文件后打开自然还是JSON格式。Buffer只是Node.js中处理二进制数据的载体,不是用来转换数据内容格式的工具。

  • 若要存储非JSON的二进制数据
    先明确目标二进制格式(比如Protocol Buffers、MessagePack这类序列化格式),再通过对应工具处理:

    1. 引入序列化库(如msgpack-lite、protobufjs)
    2. 将quadDto.quads序列化为真正的二进制数据后写入文件
      示例(以MessagePack为例):
    import msgpack from 'msgpack-lite';
    
    // 替换原代码中Buffer.from的行
    const binaryData = msgpack.encode(quadDto.quads);
    await fs.promises.writeFile(filePath, binaryData);
    

    这样写入的文件就是二进制格式,而非可读的JSON字符串。

  • 若只是误解了Buffer的作用
    如果你本来就需要存储JSON内容,那当前代码是符合预期的——Buffer仅负责处理文件写入的字节流,最终文件内容还是JSON字符串,这属于正常现象。

内容的提问来源于stack exchange,提问作者Numby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:09:55