Node.js开发Discord.js机器人时函数首次调用后ticketValue值不更新
问题根因
- Node.js的
require机制存在模块缓存,首次导入JSON文件后,后续再次调用require同路径文件会直接返回缓存的旧数据,不会重新读取磁盘上的最新文件内容。 fs.writeFile是异步API,调用写入后立即执行读取操作时,写入操作大概率还未完成,磁盘文件尚未更新,读到的自然是旧值。- 路径不一致:读取JSON时用的相对路径是
../ticketNum.json,写入时用的是./ticketNum.json,两个路径指向的不是同一个文件,写入操作实际修改的不是你读取的那个JSON文件,自然读取不到更新后的值。
修复方案
- 弃用
require读取JSON,改用fs.readFileSync读取文件内容后手动JSON.parse,绕开模块缓存。 - 统一文件路径,使用
path.resolve生成绝对路径,避免相对路径受执行目录影响出错。 - 写入操作改用同步API
fs.writeFileSync,保证写入完成后再执行后续逻辑。
修正后代码
const fs = require("fs"); const path = require("path"); // 统一JSON文件的绝对路径,避免相对路径混乱 const jsonPath = path.resolve(__dirname, "../ticketNum.json"); module.exports = { commands: ["ticket"], minArgs: 1, expectedArgs: "<message>", callback: (message, arguments, text) => { console.log("FUNCTION RUN") // 改用fs读取+JSON.parse绕开require缓存 const jsonContent = fs.readFileSync(jsonPath, "utf-8"); const jsondata = JSON.parse(jsonContent); let ticketValue = jsondata.reportNews.toString() // 补四位零可以用更简洁的padStart方法,等价于你原来的for循环 ticketValue = ticketValue.padStart(4, '0'); console.log(`#1 ${ticketValue}`) // 创建Discord频道 message.guild.channels.create(`report-incident-${ticketValue}`, { type: 'text', permissionOverwrites: [ { id: message.author.id, deny: ['VIEW_CHANNEL'], }, ], }) // ticket值加1 const newTicketValue = Number(ticketValue) + 1 console.log(`TICKET VALUE = ${newTicketValue}`) // 改用同步写入,保证写入完成后再执行后续读取 fs.writeFileSync(jsonPath, JSON.stringify({"reportNews": newTicketValue})) console.log(`Done writing, value = ${newTicketValue}`) // 读取最新值验证 const newJsonContent = fs.readFileSync(jsonPath, "utf-8"); console.log(JSON.parse(newJsonContent).reportNews.toString()) }, }
内容的提问来源于stack exchange,提问作者pie
相关产品推荐
相关产品推荐

