【问题标题】:Problems with number inputs on discord.jsdiscord.js 上的数字输入问题
【发布时间】:2021-04-18 23:23:23
【问题描述】:

我在 discord.js 中遇到计时器命令问题。我想检查用户是否输入了有效时间作为参数:

case 'timer':
  let time = args[1];
  if(!time) {
    return message.reply("<:what:784258557067526174> Please specify a time!");
  }
  message.reply(`Timer started for ${ms(ms(time))}`)

  setTimeout(function(){
    message.reply('your timer has ended')
  }, ms(time));
  break;

代码的工作方式在图像的第一个示例中可见。如果用户使用有效时间键入命令,机器人将启动一个计时器并以“计时器已启动 %time%”作为响应。

但我希望它在输入无效输入时响应特定消息,如图中的第二个示例所示:

【问题讨论】:

  • 您必须验证您的论点是否适合您提出的格式。在确定它是否适合之后,您可以回复错误消息。
  • 你为什么要在彼此内部调用两次ms()?`
  • 第一个 ms() 转换为毫秒,第二个转换回人类可读的格式。

标签: javascript node.js discord.js


【解决方案1】:

你可以这样做:

if (!/^\d+m$/.test(time)) {
    return message.reply("Invalid time")
}

在这里,我使用正则表达式来确保时间是一系列数字 (\d+) 后跟文字字符 m。如果没有,您可以发送错误消息。

【讨论】:

    【解决方案2】:

    如果您使用ms npm package,您应该知道它是如何工作的。如果你提供了一个无效的参数,它要么抛出一个错误,要么返回undefined

    const ms = require("ms")
    
    console.log(ms('2h'))
    // => 7200000
    
    console.log(ms('10 ways'))
    // => undefined
    
    console.log(ms(' '))
    // => undefined
    
    console.log(ms(''))
    // => throws an error 
    // Error: val is not a non-empty string or a valid number.
    
    console.log(ms(undefined))
    // => throws an error
    // Error: val is not a non-empty string or a valid number.
    

    这意味着你可以使用 try-catch 块来检查它是否是一个有效的输入,如果ms 抛出一个错误,catch 块中的代码就会运行。如果ms 无法将参数转换为毫秒,则返回undefined,您可以发送错误消息。请参阅下面的 sn-p:

    case 'timer':
      let time = args[1];
    
      // try to convert the time
      try {
        const timeInMilliseconds = ms(time);
    
        // if argument can't be converted to milliseconds
        if (!timeInMilliseconds) {
         return message.reply("<:what:784258557067526174> Please specify a time!");
        }
    
        // the rest of the code only runs if timeInMilliseconds exists
        setTimeout(function(){
          message.reply('your timer has ended')
        }, timeInMilliseconds);
    
        message.reply(`Timer started for ${ms(timeInMilliseconds)}`);
      } catch(err) {
        message.reply("<:what:784258557067526174> Please specify a time!");
      }
    
      break;
    

    PS:确保您还设置了用户可以设置的最长时间。如果您想接受一个月的计时器,它不会以这种方式工作。在 JavaScript 中,如果你在setTimeout 中设置的延迟大于Math.pow(2, 32)/2 - 1,它将立即运行。我知道这似乎是一个很大的数字,但它只有 ~25 天。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 2021-05-29
      • 1970-01-01
      • 2018-12-23
      • 2017-08-03
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多