Discord机器人await sleep报错:SyntaxError,求修复或替代方案
嘿,我来帮你排查这个Discord机器人的错误!
首先看你的报错信息,SyntaxError: Unexpected reserved word,核心问题有两个:
await只能在async函数里用:你注册的bot.on('message')回调函数不是async函数,直接用await肯定报错。- 语法结构错误:你把
await sleep()写在了bot.sendMessage()的参数对象里面——对象里只能放键值对,不能塞执行语句,这完全不符合JS语法。
另外还有个小坑:while (x == 1)里的x根本没定义,运行起来也会出问题。
修复后的代码
先把这些问题都补上,给你写个能跑的版本:
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // 把回调函数改成async的,这样才能用await bot.on('message', async function (user, userID, channelID, message, evt) { if (message.startsWith('!')) { // 用startsWith比substring更直观 const args = message.slice(1).split(' '); const cmd = args.shift(); // 用shift比splice(1)更简洁 switch(cmd) { case 'repeat': let isRunning = true; // 用更语义化的变量代替x // 这里加个退出条件,比如循环10次就停,或者监听停止指令 let count = 0; while (isRunning && count < 10) { // 先发送消息,await确保消息发完再等延迟 await bot.sendMessage({ to: channelID, message: 'repeated message' }); // 延迟10秒,这行要放在sendMessage外面! await sleep(10000); count++; // 如果想手动停止,可以加个!stop指令来把isRunning设为false } break; } } });
更省心的重复任务方案
其实这种定时重复发消息的场景,用setInterval比while+await更合适,不会阻塞机器人的事件循环,代码也更简洁:
let repeatInterval = null; // 存定时器ID,方便停止 bot.on('message', function (user, userID, channelID, message, evt) { if (message.startsWith('!')) { const args = message.slice(1).split(' '); const cmd = args.shift(); switch(cmd) { case 'repeat': // 先判断有没有在运行,避免重复创建定时器 if (!repeatInterval) { repeatInterval = setInterval(() => { bot.sendMessage({ to: channelID, message: 'repeated message' }); }, 10000); // 每10秒发一次 } break; case 'stop': // 加个停止指令,用户可以手动终止重复 if (repeatInterval) { clearInterval(repeatInterval); repeatInterval = null; bot.sendMessage({to: channelID, message: '重复消息已停止!'}); } break; } } });
重要提醒
不管用哪种方案,都要注意Discord的API速率限制,不要太频繁发送消息,不然机器人可能会被暂时限制使用哦。
内容的提问来源于stack exchange,提问作者hIJEFi
相关产品推荐
相关产品推荐

