Node.js Discord bot正则提取Mojang接口ID报空消息错误如何解决
问题根因
报错DiscordAPIError: Cannot send an empty message的核心原因是你调用message.channel.send(match)时,match的值为null/undefined,discord.js v13及以上版本不允许发送空内容的消息,因此抛出错误码为50006的异常。
具体错误点
- 正则表达式编写错误
你当前写的正则"(?<=id\":\"(.*)(?=\")"存在两个问题:
- 语法结构错误,后向断言缺少闭合括号,整体规则不合法,无法正常匹配内容
- 使用字符串格式定义正则,转义规则会出现偏差,且匹配成功后
match返回的是数组,你没有取捕获组的内容就直接发送,也会导致内容不符合预期
- 完全不需要用正则解析JSON
Mojang接口返回的body是标准JSON格式,用正则解析属于舍近求远,很容易出现匹配异常,直接转成JS对象取值更稳定。
修复后的代码
const username = message.content.trim(); const request = require('request'); // 用户名转义避免特殊字符导致请求错误 request(`https://api.mojang.com/users/profiles/minecraft/${encodeURIComponent(username)}`, function(error, response, body) { if (!error && response.statusCode == 200) { console.log(body) message.channel.send(body); try { // 直接解析JSON取id字段 const userInfo = JSON.parse(body); const userId = userInfo.id; // 兜底判断,避免空内容发送 message.channel.send(userId ? userId : '未查询到对应用户ID'); } catch (err) { message.channel.send('用户数据解析失败'); } } else { message.channel.send('Mojang接口请求失败,请检查输入的用户名是否有效'); } })
额外注意事项
- 发送消息前必须判断内容是否为空,添加兜底提示可以完全避免空消息报错
- 接口请求建议加异常捕获逻辑,避免接口返回异常内容导致整段代码崩溃
- 第三方接口请求的入参一定要做转义处理,避免注入或者请求路径异常问题
内容的提问来源于stack exchange,提问作者Willem
相关产品推荐
相关产品推荐

