Discord.js 不检查参数是不是存在

Posted

技术标签:

【中文标题】Discord.js 不检查参数是不是存在【英文标题】:Discord.js not checking if args existDiscord.js 不检查参数是否存在 【发布时间】:2021-08-22 18:11:24 【问题描述】:

我正在尝试使用 discord.js 和 minecraft-server-util 编写 Minecraft 服务器信息检查器,但会检查 args 是否存在或只有 1 个参数不起作用,并且它正在通过这些检查而无所事事错了,但是当我不包含任何内容时,server-util 部分会向控制台发送错误“预期主机(参数)有内容,得到一个空字符串”如果你能帮助我,我不确定问题是什么那就太好了。

命令名称:@javaserverstatus 命令和前缀是 17 个字符,这就是为什么 slice 设置为 17。

client.on('message', (message) => 
  const args = message.content.slice(17).trim().split(' ') // this is where args is defined.
  if (message.content === `$prefixjavaserverstatus`) 
    if (!args.length) 
      return message.channel.send(`You didn't provide a server, $message.author!`) // checks if args exist
    
    if (args.length > 1) 
      return message.channel.send(`Wrong input! EG. play.hypixel.net, $message.author`) // checks if there are only 1 arguments
    
  
  const util = require('minecraft-server-util')
  var serverinfo = null
  util
    .status(args.toString()) // This code is giving an error saying args does not exist.
    .then((response) => 
      console.log(response)
      serverinfo = response
      const embed = new Discord.MessageEmbed()
        .setTitle(args + ' Server Status')
        .setColor(0xff0000)
        .setDescription('IP: ' + response.host + '\n' + 'Port: ' + response.port + '\n' + 'Version: ' + response.version + '\n' + 'Online Players: ' + response.onlinePlayers.toString() + '\n' + 'Max Players: ' + response.maxPlayers.toString() + '\n')
      message.channel.send(embed)
    )
    .catch((error) => 
      console.error(error)
    )
)

【问题讨论】:

【参考方案1】:

即使消息不是命令,您的命令代码仍在运行。

例如,消息"hi" 将导致参数为[""]。然后它会简单地忽略 if 语句并运行您的命令。

此外,如果消息是 "prefixjavaserverstatus",则它的 args 长度始终为 1 ([""])。

另外需要注意的是,如果消息也是"prefixjavaserverstatus some arguments",则验证数据的 if 语句不会运行,因为消息不再等于 $prefixjavaserverstatus

您应该将代码修复为仅在命令实际运行时运行,并正确验证您的数据:

client.on("message", (message) => 
  // create args
  const args = message.content.slice(17).trim().split(" ");

  // fits the command, including arguments, not just a blank command
  if (message.content.startsWith(`$prefixjavaserverstatus`)) 
    // args.length will always be 1 or greater.
    // instead, check if the first argument is an empty string.
    if (args[0] === "") 
      return message.channel.send(`You didn't provide a server, $message.author!`); // checks if args exist
    
    if (args.length > 1) 
      return message.channel.send(`Wrong input! EG. play.hypixel.net, $message.author`) // checks if there are only 1 arguments
    

    // only if the command is valid, then run the command.
    const util = require('minecraft-server-util');
    let serverinfo = null;
    util
      .status(args.toString())
      .then((response) => 
        console.log(response);
        serverinfo = response;
        const embed = new Discord.MessageEmbed()
          .setTitle(args + " Server Status")
          .setColor(0xff0000)
          .setDescription("IP: " + response.host + "\n" + "Port: " + response.port + "\n" + "Version: " + response.version + "\n" + "Online Players: " + response.onlinePlayers.toString() + "\n" + "Max Players: " + response.maxPlayers.toString() + "\n")
        message.channel.send(embed);
      )
      .catch((error) => 
        console.error(error);
      );
  
);

下面是一个 sn-p,代码与您问题中的代码相似,以帮助突出问题:

// The following code will not work as expected
function simulateOnMessage(content) 
  console.log("================");
  const args = content.slice(17).trim().split(" ");
  console.log("Args: ", args);
  console.log("Args length: " + args.length);
  if (content === "!javaserverstatus") 
    console.log("Checking arguments...");
    if (!args.length) 
      return console.log("No server provided!");
    
    if (args.length > 1) 
      return console.log("Bad input!");
    
    console.log("No problems found!");
  
  doSomethingWith(args.toString());

function doSomethingWith(str) 
  if (str === "") 
    console.log("EMPTY STRING!");
   else 
    console.log("OK!");
  

simulateOnMessage("!javaserverstatus");
simulateOnMessage("!javaserverstatus args");
simulateOnMessage("!javaserverstatus with args");
simulateOnMessage("completely invalid message");
simulateOnMessage("hi");

TLDR;

使用String.startsWith() 或类似的东西来检查您的命令是否正在运行 仅在符合条件的情况下运行代码

【讨论】:

这甚至不是我的问题,我之前使用过 discord.js,你提到的一切都没有问题。 我确实完整地阅读了您的帖子,模拟了运行命令,并得出了我在这个答案中得出的结论。该命令自行运行,将进入 for 循环,但 args 长度将为 1。(单个空字符串的数组)。因此,它继续到 if 语句的末尾并运行命令的代码,从而导致您的问题。 我现在在答案中添加了一个 sn-p 以突出我在答案中指出的问题。 它根本没有发送消息,我的代码很好,没有工作。

以上是关于Discord.js 不检查参数是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查具有特定角色的成员是不是存在于 discord.js 的特定语音通道中

检查 Discord 服务器中是不是存在用户 ID

如何检查 discord.js v12 中的第二个参数是不是为空

MongoDB / Discord.js - 检查集合的存在

不和谐.JS |检查频道是不是存在票务机器人

Discord.js 如何检查用户是不是不接受私信