使用Ethers.js调用Solidity合约获取指定地址Player信息返回undefined的问题
解决ethers.js调用合约获取指定地址玩家信息返回undefined的问题
核心问题:合约函数参数引用错误
你编写的getOtherPlayerInfo函数存在低级语法错误,导致无法正确返回指定地址的玩家数据:
// 错误代码 function getOtherPlayerInfo(address addr) public view returns (Player memory) { return playerInfo[address]; // 误用类型名address,而非参数变量addr }
这里的address是Solidity的地址类型关键字,不是你传入的参数变量,函数实际返回的是playerInfo映射中类型默认值对应的空结构体,前端解析时就会出现undefined。
修复后的合约函数
将引用改为参数变量addr:
function getOtherPlayerInfo(address addr) public view returns (Player memory) { return playerInfo[addr]; }
⚠️ 注意:修改合约后必须重新部署到链上,否则旧合约的错误逻辑依然生效。
前端调用的优化建议
即使修复了合约,前端调用时也需要注意以下几点:
标准化地址格式
用ethers.js的getAddress()方法确保地址是校验后的标准格式,避免大小写或格式错误:import { ethers } from "ethers"; const targetAddr = ethers.getAddress("0x59D101AD9DdeA84C0e11DA137000Dd91A0b20c79");正确传递函数参数
useContractReader的第四个参数需要以数组形式传递函数参数(即使只有一个参数):const otherPlayerInfo = useContractReader( writeContracts, "YourContract", "getOtherPlayerInfo", [targetAddr] // 参数放在数组中 );验证合约ABI与部署状态
- 确认前端使用的合约ABI包含
getOtherPlayerInfo函数的正确定义 - 检查合约部署地址是否与前端配置一致
- 确认前端使用的合约ABI包含
验证步骤
- 先在Remix或其他合约调试工具中调用修复后的
getOtherPlayerInfo,传入目标地址,确认能返回正确的Player结构体数据,排除合约逻辑问题。 - 查看浏览器控制台的网络请求,检查合约调用的返回值是否存在错误(如revert信息)。
内容的提问来源于stack exchange,提问作者TakingJester766
相关产品推荐
相关产品推荐

