Discord.js async使用awaitMessages获取回复时返回内容为undefined的问题
问题根源与调整方案
你拿到undefined的核心原因是完全误解了channel.awaitMessages()的返回值结构,不存在直接读返回值.content的路径。
具体排查与修正点
- 返回值结构错配:
awaitMessages拿到的不是单条消息对象,是Collection类型的消息集合,你原来写的const time = msgs3.content是直接访问集合上根本不存在的属性,自然返回undefined。正确的取值逻辑是从集合中取出单条消息实例,再读取它的content属性。 - 缺少空值/超时判断:如果15秒内没有匹配到
filter1规则的消息,返回的集合本身是空的,哪怕取值路径正确也会触发空引用报错。 - 发送消息的逻辑缺失等待:原来的
message.channel.send(schduele3)没加await,极端情况下会出现“等待用户输入的计时器已经启动,嵌入提示还没发送到频道”的时间差,导致用户看不到提示直接超时。 - 检查过滤器逻辑:确认
filter1没有把用户发送的有效消息过滤掉——比如是否限制了只能触发命令的作者回复、是否匹配了错误的频道/消息类型,哪怕用户真的发了内容,集合是空的就会拿不到有效消息对象。 - 代码细节问题:原代码里
schduele3变量名存在拼写错误(正确拼写为schedule),不影响即时运行,但长期维护时容易出现调用错值的问题。
修正后的参考代码
const schduele3 = new Discord.MessageEmbed() .setTitle('What time will should people start joining?') .setColor('BLUE') .setDescription('Send your message within 15 seconds! Make sure to include a time zone!') // 加上await确保提示发出去再开始等用户输入 await message.channel.send(schduele3) const msgs3 = await message.channel.awaitMessages(filter1, { max:1, time:15000, // 配置超时触发错误,方便单独处理用户未及时回复的场景 errors: ['time'] }) // 从集合中取第一条匹配的消息实例,再读内容 const repliedMessage = msgs3.first() const time = repliedMessage.content
内容的提问来源于stack exchange,提问作者no lol
相关产品推荐
相关产品推荐

