Node.js使用fs写入对象数组到文件显示[object Object]如何解决
问题原因
直接在模板字符串中传入JS对象时,运行时会自动调用对象的toString()方法做隐式类型转换,普通普通对象(Plain Object)的默认toString()返回值固定为[object Object],因此写入文件的内容全是该字符串,无法展示对象实际内容。
修正方法
要输出你预期的JS对象字面量格式,使用Node.js内置的util模块提供的inspect方法格式化对象即可,该方法会将对象转换为符合JS语法的可读字符串,不会出现类型转换问题。
完整修正代码如下:
const fs = require('fs'); const util = require('util'); // 引入内置格式化工具模块 const writeStream = fs.createWriteStream('file.txt'); const pathName = writeStream.path; // 格式化对象后再写入,匹配预期的缩进、单行、末尾加逗号的格式 array.forEach(value => writeStream.write(` ${util.inspect(value, { compact: true })},\n`)); // 所有数据写入完成触发 writeStream.on('finish', () => { console.log(`wrote all the array data to file ${pathName}`); }); // 写入错误处理 writeStream.on('error', (err) => { console.error(`There is an error writing the file ${pathName} => ${err}`) }); // 关闭流 writeStream.end();
补充说明
util.inspect()的compact: true配置会让对象保持单行紧凑输出,和你给出的预期格式完全一致;如果去掉该配置,默认会将对象的每个键值对拆分为多行输出。- 如果你不需要严格匹配JS源码格式,仅做结构化数据存储,也可以替换为
JSON.stringify(value)做序列化,但该方法输出的是标准JSON格式,键名和字符串都会使用双引号,和你预期的展示效果有差异。 - 900条小对象的写入场景无需额外处理流背压,如果后续数组量级提升到十万条以上,建议监听
write()方法的返回值处理背压,避免内存占用过高。
内容的提问来源于stack exchange,提问作者qubitz
相关产品推荐
相关产品推荐

