NFT市场开发中buyNft函数出现Cannot read properties of undefined (reading '_hex')错误
解决ethers调用合约时出现的"Cannot read properties of undefined (reading '_hex')"错误
你遇到的错误是因为传入合约方法的某个参数不是ethers可识别的有效类型,导致内部读取_hex属性时对象未定义。结合你的代码和调试信息,给出以下排查和解决方向:
1. 检查nft.tokenId的有效性
虽然price能正常输出,但nft.tokenId可能是undefined、null,或者是无法被ethers解析为数值的字符串。ethers在处理合约的uint256类型参数时,需要传入BigNumber或可转换为BigNumber的有效数值。
解决方法:
- 调用前打印
nft.tokenId确认值是否存在 - 用
ethers.BigNumber.from()显式转换tokenId:const tokenId = ethers.BigNumber.from(nft.tokenId); const transaction = await contract.createMarketSale(tokenId, { value: price });
2. 核对合约ABI中createMarketSale的参数定义
大概率是你传入的参数顺序或数量和合约实际要求不匹配。比如很多NFT市场合约的createMarketSale方法需要两个参数:NFT合约地址和tokenId,而不是仅传tokenId。如果漏传参数,会导致后续的value配置被当成了需要解析的数值参数,从而触发错误。
解决方法:
- 打开
MarketAddressABI,找到createMarketSale的定义,确认参数数量、顺序和类型。比如如果合约方法是:
你需要补传NFT合约地址:function createMarketSale(address nftContract, uint256 tokenId) payable externalconst transaction = await contract.createMarketSale(nft.contractAddress, tokenId, { value: price });
3. 验证合约实例的正确性
确保MarketAddress是NFT市场合约的正确地址,MarketAddressABI包含createMarketSale的完整定义。如果ABI错误或地址不匹配,ethers会动态生成方法,但参数处理会出现异常。
修正后的示例代码
const buyNft = async (nft) => { const web3Modal = new Web3Modal(); const connection = await web3Modal.connect(); const provider = new ethers.providers.Web3Provider(connection); const signer = provider.getSigner(); const contract = new ethers.Contract( MarketAddress, MarketAddressABI, signer ); const price = ethers.utils.parseUnits(nft.price.toString(), "ether"); console.log("price:", price); // 校验并转换tokenId if (!nft.tokenId) { console.error("错误:tokenId未定义"); return; } const tokenId = ethers.BigNumber.from(nft.tokenId); console.log("tokenId:", tokenId); try { // 注意:如果合约需要NFT合约地址,要加上第一个参数 const transaction = await contract.createMarketSale(tokenId, { value: price, }); await transaction.wait(); console.log("购买NFT成功"); } catch (err) { console.error("购买失败:", err); } };
内容的提问来源于stack exchange,提问作者MALIK forz
相关产品推荐
相关产品推荐

