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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:18:01