Node.js使用MojangJS getUUID报Cannot read property 'hasOwnProperty' of undefined错误
针对MojangJS抛出
Cannot read property 'hasOwnProperty' of undefined的解决方法 - 优先校验传入
getUUID方法的入参有效性
当前代码中传入的是usernameParts[1],如果用户名拆分逻辑存在下标偏移、拆分后数组长度不足的问题,会直接拿到undefined作为入参传入方法。MojangJS内部在校验参数时,会对传入的参数对象调用hasOwnProperty方法,一旦入参是undefined就会直接触发该类型错误。
可以在调用方法前增加前置判断,过滤掉无效入参:// 先取出目标用户名,做非空、格式校验 const targetUsername = usernameParts[1]?.trim(); // Minecraft正版用户名规则为3-16位,支持字母、数字、下划线 if (!targetUsername || !/^[a-zA-Z0-9_]{3,16}$/.test(targetUsername)) { console.error("传入的用户名格式无效"); return; } - 排查依赖版本的兼容问题
早期发布的MojangJS版本存在未处理空响应的逻辑漏洞:当查询的用户名不存在、请求触发Mojang接口限流返回空内容时,库内部会默认把接口返回值当作普通对象处理,尝试调用其hasOwnProperty方法,由于此时返回值为undefined,就会抛出对应类型错误。
这种场景下的修复方式:- 升级本地安装的MojangJS到最新稳定版本,新版库已经补充了空响应、无效入参的前置校验逻辑,不会直接抛出底层的类型错误
- 若无法升级版本,可在调用逻辑中增加前置校验,拦截所有不符合用户名规则的请求,避免触发底层逻辑报错
- 调整Promise的错误捕获逻辑
当前代码将await与.then().catch()链式调用混用,虽然语法合法,但容易丢失错误的上下文信息。可以替换为标准的async/await写法,将错误捕获收敛在try/catch块中,针对不同类型的错误做分支处理:let id; const targetUsername = usernameParts[1]?.trim(); if (!targetUsername) { console.error("用户名参数为空,无法查询UUID"); return; } try { id = await mojangjs.getUUID(targetUsername); } catch (err) { // 针对库内部抛出的属性读取错误,做友好提示 if (err.message.includes("hasOwnProperty")) { console.error("UUID查询失败:请确认输入的是存在的Minecraft正版账号名"); return; } console.error("查询流程出错:", err); }
内容的提问来源于stack exchange,提问作者SirArchibald
相关产品推荐
相关产品推荐

