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

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

【问题讨论】:

    标签: ethereum web3js decentralized-applications


    【解决方案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; 
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 1970-01-01
      • 2019-10-03
      • 2012-07-29
      • 2016-05-09
      • 2021-04-09
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多