discord.js读取txt文件时字面量\n未解析为换行问题求解
问题根因
你txt文件里手动输入的\n是普通的字符组合(反斜杠+字母n),不是JS语法中代表换行的转义字符。fs.readFileSync读取文件时会原样保留文本内容,不会自动把这两个字符合并解析成换行符,所以最终返回的内容会直接显示1\n2,不会真的换行。
另外你现有代码还有3个容易出bug的小问题:
- 交互回调的参数名拼错了,正确是
interaction不是interation - 回复配置的属性名拼错了,正确是
ephemeral不是emphemral,否则临时消息配置不会生效 - 用相对路径读文件时,路径是相对于node启动时的工作目录,不是当前脚本所在目录,很容易出现找不到文件的报错
修复方案
读取文件分割内容后,额外把每一行里的字面量\n替换成真实换行符即可,同时修正上面提到的小问题,修改后的完整代码如下:
const { SlashCommandBuilder } = require(`@discordjs/builders`); const fs = require("fs"); const path = require('path'); const scriptName = path.basename(__filename); const command = scriptName.slice(0, -3); // 拼接绝对路径,避免工作目录变化导致找不到文件 const file = path.resolve(__dirname, `./texts/${command}.txt`); const text = fs.readFileSync(file, "utf-8"); // 兼容Windows和Unix换行格式分割,替换字面量\n为真实换行,过滤空行 const array = text.split(/\r?\n/) .map(line => line.replace(/\\n/g, '\n')) .filter(line => line.trim()); function getRandomItem(arr) { const randomIndex = Math.floor(Math.random() * arr.length); return arr[randomIndex]; } module.exports = { data: new SlashCommandBuilder() .setName(command) .setDescription(`meeeoww??`), async execute(interaction) { interaction.reply({ content: getRandomItem(array), ephemeral: true }); }, };
效果说明
修复后,txt中写的1\n2会被处理成带真实换行的字符串,Discord消息里的展示效果和你预期一致:
1 2
后续新增回复内容时,直接在txt里需要换行的位置写\n即可,代码会自动完成解析。
内容的提问来源于stack exchange,提问作者FluffyWasTaken
相关产品推荐
相关产品推荐

