无法将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这类序列化格式),再通过对应工具处理:- 引入序列化库(如
msgpack-lite、protobufjs) - 将
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
相关产品推荐
相关产品推荐

