web3.eth.accounts [0]返回undefined

时间:2018-05-24 18:19:30

标签: javascript ethereum solidity web3js metamask

我是新手,并且正在通过简单的webapp进行探索。我有一个Web应用程序,它接受一些细节和一个按钮按下哪些细节应该部署到智能合约创建的块。已从remix IDE成功部署详细信息,但在通过Web应用程序输入时会出现以下异常。

inpage.js:1 Uncaught Error: Invalid number of arguments to Solidity function
at Object.InvalidNumberOfSolidityArgs (inpage.js:1)
at u.validateArgs (inpage.js:1)
at u.toPayload (inpage.js:1)
at u.sendTransaction (inpage.js:1)
at u.execute (inpage.js:1)
at HTMLButtonElement.<anonymous> ((index):231)
at HTMLButtonElement.dispatch (jquery-3.2.1.slim.min.js:3)
at HTMLButtonElement.q.handle (jquery-3.2.1.slim.min.js:3)

在网上冲浪时,我发现这可能是因为web3.eth.accounts[0]返回&#39; 未定义&#39;这就是我的情况。

相反,虽然在控制台上显示web3.eth,它确实会在索引0处显示帐户和 MetaMask 地址。 我读过它可能是因为MetaMask可能还没有完全支持web3js 1.0,但我无法找到它的解决方案。

另外,如何检查我正在使用的web3的版本以及如何在必要时弃用。

这是我尝试访问web3.eth.accounts[0]

的方法
web3.eth.defaultAccount = web3.eth.accounts[0];
console.log(web3.eth.defaultAccount);  // returns undefined

我也试过以下方法,但无济于事:

var myAccount;
web3.eth.getAccounts(function(err,res){
     if(!err)
     {
        myAccount = res;
        console.log(myAccount);
     }
});

这会返回帐户地址,但myAccount变量会再次返回&#39; undefined &#39;在getAccounts方法之外使用时。在if部分中写入更多逻辑也无助于给出上述异常。

我尝试了一些但无法找到解决方案。如果我错过任何理解,请指导和纠正。

修改

您可以在此处找到源代码。 https://github.com/anishsamant/Solidity-Demo

请参阅 Courses.sol 获取可靠性文件 请参阅 index.html 以获取网络应用。

1 个答案:

答案 0 :(得分:1)

web3中的方法(如getAccounts)是异步的。

注意 web3版本1.x.x返回承诺。所以你使用promises,你也可以用async / await语法实现它。

web3版本0.x.x不返回promises,只能使用回调。

web3版本1.x.x的代码(我只能假设您可能正在使用)。

const myFunc = async () => {
    try {
        const myAccounts = await web3.eth.getAccounts();
        console.log(myAccounts)
        return myAccounts;

    } catch (err) {
        console.log(err);
    }
}

myFunc()