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

Ana*_*had 7 ethereum web3js decentralized-applications

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

小智 6

@Petr Hejda 之前的回答对我不起作用,他针对评论中@Chakshu Jain 问题的建议也不起作用。

\n

相反,我从开头和结尾删除了一些字符 \xe2\x80\x94,其中slice()\xe2\x80\x94 在解析 JSON 时导致错误,这样我就可以处理错误消息并获取错误消息。

\n
 if (err) {\n        \n        var errorMessageInJson = JSON.parse(\n          err.message.slice(58, err.message.length - 2)\n        );\n\n        var errorMessageToShow = errorMessageInJson.data.data[Object.keys(errorMessageInJson.data.data)[0]].reason;\n\n        alert(errorMessageToShow);\n        return; \n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我用谷歌搜索了以前关于这个主题的帖子,但没有一个起作用。做像“slice()...”这样的事情总是感觉很奇怪,只得到一条错误消息哈哈感谢分享 (2认同)

Pet*_*jda 3

它在 JS 错误对象中以data.<txHash>.reason.


这是一个错误的 Solidity 代码

pragma solidity ^0.8.0;

contract Test {
    function foo() public {
        revert('This is error message');
    }
}
Run Code Online (Sandbox Code Playgroud)

因此调用该函数的事务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"
}
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用,我收到“数据”未定义。 (2认同)