如何使用fs.writeFileSync将输入内容写入JSON数组列表格式存储
代码调整方案
现有逻辑的问题
当前代码没法生成列表结构,根源在两点:
- 直接把单次输入的字符串做JSON序列化写入,没有套数组结构,最终文件里存的就是单个字符串值
- 每次运行都是直接覆盖文件内容,没有读取、合并已有词汇的逻辑,哪怕临时把字符串包进数组,下一次运行也会把之前存的内容全部冲掉
必加的逻辑环节
要实现符合要求的JSON列表存储,需要补全三块逻辑:
- 固定用数组作为存储结构,目标存储文件不存在时,先初始化空数组
- 写入前先读取已有文件内容,兜底处理文件损坏、JSON格式解析失败的异常场景
- 对新输入的词汇做去空、去重处理后,追加到数组末尾,再把完整数组序列化写回文件
修正后的完整代码
const fs = require('fs'); const readline = require('readline'); const path = require('path'); // 定义存储文件的绝对路径,避免跨系统路径拼接问题 const STORE_FILE = path.join(__dirname, 'startkeywords.json'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 读取本地已存的词汇列表 function loadExistingKeywords() { // 文件不存在时直接返回空列表 if (!fs.existsSync(STORE_FILE)) { return []; } try { const rawContent = fs.readFileSync(STORE_FILE, 'utf8'); const parsedContent = JSON.parse(rawContent); // 兜底校验:解析出的内容不是数组时返回空列表,避免后续写入报错 return Array.isArray(parsedContent) ? parsedContent : []; } catch (err) { console.log('本地存储文件格式异常,将重置为新的词汇列表'); return []; } } rl.question('Hello! ', (answer) => { // 去掉输入内容首尾的空格,过滤空输入 const normalizedInput = answer.trim(); if (!normalizedInput) { console.log('输入内容为空,未完成存储'); rl.close(); return; } const keywordList = loadExistingKeywords(); // 去重:避免同一个词汇反复存入列表 if (!keywordList.includes(normalizedInput)) { keywordList.push(normalizedInput); } // 把完整列表序列化后写回文件,保留格式化缩进 fs.writeFileSync(STORE_FILE, JSON.stringify(keywordList, null, 4)); console.log(`已将"${normalizedInput}"存入词汇列表 :)`); console.log(`存储文件路径:${STORE_FILE}`); rl.close(); });
最终存储效果
多次运行程序、分别输入hello、Heya这类问候词后,生成的startkeywords.json就是标准列表结构,示例如下:
[ "hello", "Heya", "hi" ]
后续做随机打招呼功能时,直接读取这个文件解析成数组,用Math.random()取随机元素输出就行,不需要再做格式转换。
内容的提问来源于stack exchange,提问作者Yeet
相关产品推荐
相关产品推荐

