Discord Bot 无法正确读取.json数据库导致重复写入用户名故障
问题原因与修复方案
核心错误
你的判断逻辑调用关系完全错误:Array.includes()是数组提供的方法,作用是判断指定元素是否存在于数组内。你原代码写的!message.author.username.includes(db.recognizedusers)是检查「用户用户名字符串是否包含整个数组对象」,这个判断永远为假,所以每次都会触发写入逻辑。
把if条件里的判断改成如下内容即可解决重复写入的问题:
!db.recognizedusers.includes(message.author.username)
其他可优化点
- 多余导入删除:你导入的
const { json } = require('stream/consumers');全程没有用到,可以直接删掉,减少不必要的依赖加载。 - 重复读取冗余:你开头已经通过
require('./database.json')加载了数据库内容,后面又用fs.readFileSync重复读取是多余操作,可以删掉后面的读取逻辑,直接用require加载的对象操作即可。 - 事件名适配:如果你用的是discord.js v13及以上版本,
message事件已经被废弃,改成messageCreate事件才能正常接收消息。 - 标识更可靠:不推荐用用户名当做用户唯一标识,Discord用户名允许修改,同一个人换名字就会被识别成新用户,建议改用
message.author.id(用户永久唯一ID)存储和判断。
修复后的核心逻辑示例
client.on('messageCreate', message => { let msg_content = message.content.toLowerCase() if (msg_content.includes('test 1') && msg_content.includes('test 2')) { message.channel.send('test 2: electric boogaloo') } if (msg_content.includes('test') && !db.recognizedusers.includes(message.author.id)) { message.channel.send('unrecognized name') db.recognizedusers.push(message.author.id) fs.writeFileSync('./database.json', JSON.stringify(db)); } });
内容的提问来源于stack exchange,提问作者Infinite_Bed
相关产品推荐
相关产品推荐

