React Dapp调用ERC721合约mint方法,Metamask签名交易后后续代码不执行
问题核心原因
你遇到的await后续代码不执行问题,主要是两类原因导致:一是send方法执行过程中抛出异常但未被捕获,代码直接中断运行;二是web3的send方法默认等待链上区块确认的逻辑卡住,始终没有触发resolve。
具体解决方案
- 补充异常捕获逻辑
你当前的async方法没有做错误捕获,只要send过程中出现任何异常(比如用户拒绝签名、链上执行revert、网络连接中断等),代码会直接跳出当前函数,不会执行后续的console.log。
修改mint函数加上try/catch即可查看具体错误:
mint = async (addressTo, count) => { try { console.log('Address to which NFT will be minted :', addressTo); console.log('Number of NFTs requested to be minted is', count); const tx = await this.state.contract.methods.mint(addressTo, count).send({from: this.state.account}) console.log('Transaction from calling mint function is:', tx); } catch (err) { console.error('mint执行出错:', err) } }
校验网络与出块配置
你已经确认链上mint成功,说明交易已经上链,大概率是web3等待确认的逻辑卡住:- 确认Metamask连接的网络RPC地址、链ID和你启动
ganache-cli的参数完全一致,ganache默认端口为8545、默认链ID为1337,要和Metamask的自定义网络配置完全对应 - 检查ganache是否开启了自动出块:如果启动ganache时没有加
--blockTime [秒数]参数,ganache默认只在收到交易时出块,你可以启动时加上ganache-cli --blockTime 1设置每秒自动出块,避免web3等待确认超时
- 确认Metamask连接的网络RPC地址、链ID和你启动
调整web3 send方法配置
你可以给send方法传入额外配置,降低确认要求,或者主动监听交易事件,不用等完全确认就执行后续逻辑:
// 方式1:设置0个区块确认就resolve const tx = await this.state.contract.methods.mint(addressTo, count).send( {from: this.state.account}, {confirmationBlocks: 0} ) // 方式2:监听事件分步处理逻辑 this.state.contract.methods.mint(addressTo, count).send({from: this.state.account}) .on('transactionHash', (hash) => { console.log('交易已提交,哈希:', hash) }) .on('receipt', (receipt) => { console.log('交易已确认,收据:', receipt) }) .on('error', (err) => { console.error('交易出错:', err) })
- 检查web3初始化逻辑
确认你初始化web3实例时用的是Metamask的provider,而非本地ganache的provider,避免交易签名和确认逻辑出现不一致。
内容的提问来源于stack exchange,提问作者andromeda
相关产品推荐
相关产品推荐

