Discord.js v13.6.0中实现数字验证的重复用户输入提示方案咨询
Discord.js v13.6.0中实现数字验证的重复用户输入提示方案咨询
我明白你现在在Discord.js v13.6.0里做消息收集器,想要实现「用户输入非数字时重复提示,直到输入有效数字」的逻辑,之前用while循环没成功对吧?这大概率是因为awaitMessages是异步操作,普通同步while循环不会等待收集完成就直接执行下一轮,导致逻辑混乱。
下面给你一个优化后的实现方案,解决这个问题的同时还能让代码更易读:
首先,先修正过滤器(原过滤器相当于没做任何过滤,会接收所有用户的消息),确保只响应发起命令的用户:
const filter = msg => msg.author.id === message.author.id;
然后用异步do-while循环来处理价格输入的验证逻辑,结合async/await避免回调嵌套,同时统一处理错误:
try { // 发送初始询问物品名称的消息 const mainMessage = await message.channel.send(`Jak chcesz nazwać swój przedmiot?`); // 收集物品名称 const nameCollected = await mainMessage.channel.awaitMessages({ filter, max: 1, time: 900000, errors: ['time'] }); const itemName = nameCollected.first().content; // 初始化价格相关变量 let priceItem; let isPriceValid = false; // 循环收集价格,直到输入有效数字 do { // 更新主消息提示用户输入价格 await mainMessage.edit({ content: `Nazwa: ${itemName}\nPodaj ile ma kosztować przedmiot.` }); try { // 收集价格输入 const priceCollected = await mainMessage.channel.awaitMessages({ filter, max: 1, time: 900000, errors: ['time'] }); const userInput = priceCollected.first().content; // 验证输入是否为有效数字(排除空字符串、纯符号等无效情况) if (!isNaN(userInput) && !isNaN(parseFloat(userInput))) { priceItem = parseFloat(userInput); isPriceValid = true; } else { // 输入无效,提示用户重新输入 await message.channel.send('Wprowadź liczbę! Spróbuj ponownie.'); } } catch (timeoutError) { // 处理超时情况 await message.channel.send('Czas się skończył! Anulowano operację.'); return; // 超时后直接退出流程 } } while (!isPriceValid); // 所有输入有效,更新主消息展示结果 await mainMessage.edit({ content: `Nazwa: ${itemName}\nPieniądze: ${priceItem}.` }); } catch (error) { // 处理其他异常情况 await message.channel.send(`Wystąpił nieoczekiwany błąd.\n**${error}**`); }
关键优化点说明:
- 用
do-while循环:保证至少让用户输入一次,之后只要输入无效就重复提示,完美适配你的需求。 - 修正数字验证逻辑:原代码里
isNaN(priceItem.content)是错误的(因为priceItem已经是消息内容了),这里改用parseFloat结合isNaN,能更准确判断输入是否为有效数字。 - 统一错误处理:用外层
try/catch处理全局异常,内层try/catch处理价格收集的超时情况,逻辑更清晰。 - 避免回调地狱:把原有的
then嵌套改成async/await,代码可读性大幅提升。
备注:内容来源于stack exchange,提问作者user11664235
相关产品推荐
相关产品推荐

