You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.js为语音频道用户发XP报错:await仅可在async函数使用如何解决

错误原因

该语法报错的核心诱因有两点:

  1. await 关键字仅允许在被async标记的异步函数内部使用,你当前代码里的setInterval回调函数、遍历成员的回调函数都未添加async声明,直接使用await会触发语法校验失败
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:54:05