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

Discord.js的args存在性校验失效导致minecraft-server-util报错求助

问题修复方案

核心问题点

  • 命令匹配逻辑错误:使用===全等判断消息内容,只要命令后携带参数就无法命中判断,导致整个参数校验逻辑完全不执行。
  • 参数校验逻辑存在漏洞:当未输入任何参数时,slice(17).trim()得到空字符串,执行split(' ')会返回[""],数组长度为1,因此!args.length判断永远不会触发,参数为空的情况无法被拦截。
  • 业务逻辑位置错误:服务器查询代码没有放在命令判断的代码块内,无论用户发送的消息是否匹配该查询命令,都会强制执行服务器查询逻辑,极易触发参数错误。
  • 代码规范问题:minecraft-server-util模块的引入放在了message事件回调内部,每次触发消息事件都会重复执行引入操作,存在不必要的性能损耗;调用util.status()时使用args.toString(),直接取数组第一个元素args[0]更合理。

修复后代码

// 模块引入放到事件外面,全局只执行一次
const util = require('minecraft-server-util')

client.on('message', (message) => {
  // 先过滤非目标命令的消息,用startsWith匹配,携带参数也能命中
  if (!message.content.startsWith(`${prefix}javaserverstatus`)) return

  // 匹配到命令后再处理参数
  const args = message.content.slice(17).trim().split(' ')
  // 校验参数为空的情况:trim后为空串,或第一个参数无内容
  if (!args.length || !args[0]) {
    return message.channel.send(`You didn't provide a server, ${message.author}!`)
  }
  // 校验参数数量
  if (args.length > 1) {
    return message.channel.send(`Wrong input! EG. play.hypixel.net, ${message.author}`)
  }

  // 所有校验通过后再执行查询逻辑
  util.status(args[0])
    .then((response) => {
      console.log(response)
      const embed = new Discord.MessageEmbed()
        .setTitle(args[0] + ' 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)
      message.channel.send(`Failed to query server status, please check if the server address is valid, ${message.author}`)
    })
})

补充说明

调整后逻辑执行顺序为:先过滤非目标命令的消息,再处理参数、执行校验,所有校验通过后才会执行服务器查询逻辑,不会再出现校验跳过的情况,同时也避免了无效消息触发错误查询的问题。

内容的提问来源于stack exchange,提问作者RG2N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:06:08