discord.js为语音频道用户发XP报错:await仅可在async函数使用如何解决
错误原因
该语法报错的核心诱因有两点:
await关键字仅允许在被async标记的异步函数内部使用,你当前代码里的setInterval回调函数、遍历成员的回调函数都未添加async声明,直接使用await会触发语法校验失败Math.floor、Math.random均为同步执行的原生方法,完全不需要搭配await使用,属于冗余的错误语法
修复后可运行代码
setInterval(async () => { const voiceChannel = client.guilds.cache.get(process.env.DISCORD_GUILD_ID).channels.cache.get("539323872101531670"); // 增加频道存在校验,避免缓存未加载、频道被删时报错 if (!voiceChannel) return console.error('目标语音频道不存在,跳过本次XP发放'); const members = voiceChannel.members; if (members.size <= 0) return; // 改用for...of遍历,更适配异步流程控制 for (const member of members.values()) { // 可选:跳过机器人用户,不发放XP if (member.user.bot) continue; console.log(member.user.id); // 同步方法移除多余的await const randomXP = Math.floor(Math.random() * 100) + 1; // 异步方法可正常使用await,因为外层函数已标记async const hasLevelUP = await Levels.appendXp(member.user.id, process.env.DISCORD_GUILD_ID, randomXP); // 可选:补充升级后的自定义逻辑,比如发通知 if (hasLevelUP) { console.log(`用户${member.user.tag}升级成功`); } } }, 30000);
额外说明
如果你习惯使用forEach遍历,也可以直接给forEach的回调添加async标记:members.forEach(async member => { 逻辑代码 })
但更推荐用for...of写法,避免forEach无法等待所有异步任务执行完成的问题。
内容的提问来源于stack exchange,提问作者militaryk
相关产品推荐
相关产品推荐

