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
相关产品推荐
相关产品推荐

