如何在 web3.js 中正确使用还原原因在 UI 中显示有意义的错误消息

Posted

技术标签:

【中文标题】如何在 web3.js 中正确使用还原原因在 UI 中显示有意义的错误消息【英文标题】:How to properly use revert reason in web3.js to show meaningful error message in UI 【发布时间】:2021-06-26 21:19:26 【问题描述】:

我想使用 web3.js 向用户显示还原原因,例如在用户尝试铸造已经铸造的 erc721 令牌的情况下。我正在使用 try catch 块并查看错误消息,但我想隔离错误消息以向用户显示有意义的原因。提前致谢。

【问题讨论】:

【参考方案1】:

在 JS 错误对象中返回为data.<txHash>.reason


这是一个错误的 Solidity 代码

pragma solidity ^0.8.0;

contract Test 
    function foo() public 
        revert('This is error message');
    

因此,调用foo() 函数的事务应该返回消息This is error message

try 
    await myContract.methods.foo().send();
 catch (e) 
    const data = e.data;
    const txHash = Object.keys(data)[0]; // TODO improve
    const reason = data[txHash].reason;

    console.log(reason); // prints "This is error message"

【讨论】:

它不工作,我得到“数据”未定义。 @ChakshuJain 您是否也将错误对象命名为e?你没有忘记分配data = e.data吗? 是的,正如你所说,附上错误图片link。【参考方案2】:

previous answer by @Petr Hejda 对我不起作用,his suggestion 在 cmets 中对 @Chakshu Jain's problem 的响应也没有。

相反,我删除了一些在解析 JSON 时导致错误的字符(从开头和结尾使用 slice()),以便我可以处理错误消息并获取错误消息。

 if (err) 
        
        var errorMessageInJson = JSON.parse(
          err.message.slice(58, err.message.length - 2)
        );

        var errorMessageToShow = errorMessageInJson.data.data[Object.keys(errorMessageInJson.data.data)[0]].reason;

        alert(errorMessageToShow);
        return; 

【讨论】:

以上是关于如何在 web3.js 中正确使用还原原因在 UI 中显示有意义的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中使用 Web3 和 Metamask

在 swapExactTokensForTokens (UniswapV2Router02, web3.js) 期间恢复交易

我们如何在 Vue.js 中使用 web3.js 库?

如何使用 web3.js 在 Truffle 测试中进行基本算术运算

如何使用 web3 js 在 uniswap 上交换令牌

如何获取在与@solana/web3.js 的交易中转移的自定义令牌数量?