discord.js中用node-fetch调用Mojang API如何判断无返回数据避免崩溃
当用户名不存在时,Mojang API会返回204 No Content状态码,此时响应体为空,你直接调用.json()解析空内容会抛出语法错误,再加上你判断的mojang.empty属性本身不存在,就会触发未捕获异常导致机器人崩溃。
你可以按如下方式修改代码:
fetch(`https://api.mojang.com/users/profiles/minecraft/${username}`) .then(res => { // 先校验响应状态,用户名不存在时状态码为204,res.ok为false if (!res.ok) throw new Error('USER_NOT_FOUND') return res.json() }) .then(async mojang => { // 二次校验返回结构合法性,避免接口异常 if (!mojang?.id) { return interaction.reply({ content: `未找到名为 **${username}** 的用户`, ephemeral: true }) } // 此处编写正常业务逻辑,mojang.id即为无分隔符的UUID }) .catch(async err => { // 统一捕获所有异常,避免机器人崩溃 if (err.message === 'USER_NOT_FOUND') { return interaction.reply({ content: `未找到名为 **${username}** 的用户`, ephemeral: true }) } console.error('Mojang API调用出错:', err) return interaction.reply({ content: '查询失败,请稍后重试', ephemeral: true }) })
可选优化
- 前置校验用户名格式:Minecraft合法用户名仅支持2-16位的大小写字母、数字、下划线,不符合规则的无需发起接口请求直接返回提示即可
- 高频查询场景可以添加本地缓存,减少接口请求频次,提升响应速度
- 可添加超时逻辑,避免接口无响应导致请求卡住
内容的提问来源于stack exchange,提问作者dmcpacks
相关产品推荐
相关产品推荐

