Node.js使用数组includes结合one-liner-joke生成笑话文件代码异常
代码无法运行的核心原因
你的代码存在多处逻辑和兼容性问题,直接导致运行失败/死循环:
- 去重判断逻辑完全写反:当前判断为数组已包含当前笑话时才追加内容,但初始数组为空,永远无法进入判断分支,直接触发死循环。
- 循环边界错误:
while (i <= amount)的判定条件会多生成1条内容,比如配置生成5条笑话时实际会循环6次。 - 未处理目录不存在的异常:写入目标为
./created_files/jokes.txt,如果本地没有created_files文件夹,文件写入方法会直接抛出路径不存在的错误。 - 字符串替换逻辑不全:
joke.body.replace(",", "")只会替换内容里的第一个逗号,无法清理所有逗号字符;最后数组转字符串时额外做的全局逗号替换属于冗余操作,是前面替换逻辑不全打的补丁。 - 缺少环境变量兜底:如果.env文件缺失、配置项漏写,会出现接口参数为undefined、数量解析为NaN的问题,直接导致依赖调用失败、循环异常。
- 存在冗余无效代码:开头声明的
getRandomJokeWithTag、counter变量从未被调用,属于无效代码占用。
修正后可直接运行的代码
const oneLinerJoke = require("one-liner-joke"); const fs = require("fs"); const path = require("path"); // 加载.env环境变量 require("dotenv").config(); // 读取环境变量并设置兜底默认值 const jokeSubject = process.env.JOKE_SUBJECT || "general"; const jokeAmount = parseInt(process.env.JOKE_AMOUNT, 10) || 5; const outputDir = path.join(__dirname, "created_files"); const outputFilePath = path.join(outputDir, "jokes.txt"); const jokeList = []; // 循环收集指定数量的不重复笑话 while (jokeList.length < jokeAmount) { const jokeResult = oneLinerJoke.getRandomJokeWithTag(jokeSubject); // 清理笑话内容里的所有逗号 const cleanJoke = jokeResult.body.replace(/,/g, "").trim(); // 仅当笑话不在已有列表中时才追加,实现去重 if (!jokeList.includes(cleanJoke)) { jokeList.push(cleanJoke); } } // 写入文件前先检查目录,不存在则递归创建 if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } // 用换行符拼接所有笑话写入文件 fs.writeFileSync(outputFilePath, jokeList.join("\n")); console.log(`生成完成:共${jokeAmount}条【${jokeSubject}】主题笑话,已保存到${outputFilePath}`);
运行前置操作
- 先在项目根目录安装所需依赖,执行命令:
npm install one-liner-joke dotenv - 在项目根目录创建
.env文件,按需配置两个参数:# 笑话主题,可选值参考依赖支持的标签,比如general/it/sports/food等 JOKE_SUBJECT=it # 要生成的笑话数量 JOKE_AMOUNT=10 - 如果配置了依赖不支持的主题标签,会出现拿不到有效笑话、循环长时间卡住的问题,更换为支持的标签即可。
内容的提问来源于stack exchange,提问作者Bar
相关产品推荐
相关产品推荐

