【问题标题】:Why web3.eth.getAccounts().then(console.log) return empty array?为什么 web3.eth.getAccounts().then(console.log) 返回空数组?
【发布时间】:2020-01-17 00:27:22
【问题描述】:

我尝试web3.eth.getAccounts().then(console.log); 后得到了一个空数组,并且还收到了一个警告,即./node_modules/web3-eth-accounts/src/scrypt.js Critical dependency: the request of a dependency is an expression。在这个项目中,我首先命令create-react-app lottery_react,然后我在lottery_react 文件夹中所做的所有更改都是用一行web3.eth.getAccounts().then(console.log); 修改App.js 并创建web3.js 文件。我在这些文件中找不到什么问题。请帮忙!

我见过thisthis,但我们都面临着不同类型的问题。

这是我的 App.js

import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';

import web3 from './web3';

class App extends Component {
  render(){
    web3.eth.getAccounts().then(console.log);
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
      </div>
    );
  }
}

export default App;

这是我的 web3.js 文件


import Web3 from 'web3';

const web3 = new Web3(window.web3.currentProvider);

export default web3;

【问题讨论】:

  • 如果您使用 Metamask,请转到您的帐户设置 -> 连接并添加 localhost。然后 web3.eth.getAccounts() 将起作用

标签: javascript reactjs ethereum web3


【解决方案1】:

我正在使用 MetaMask,这对我有用。找到它here

ethereum
  .request({ method: 'eth_accounts' })
  .then((accounts) => { 
     console.log(accounts); 
  })
  .catch((err) => {
    console.error(err);
  });

【讨论】:

    【解决方案2】:

    确保您将 React 应用与 MetaMask 扩展连接。

    【讨论】:

      【解决方案3】:

      您现在需要获得用户的request 权限才能获取他们的帐户。所以不要使用getAccounts(),而是使用requestAccounts()

      web3.eth.requestAccounts().then(console.log);
      

      【讨论】:

      • 这适用于 Chrome+Metamask,但不适用于集成 Wallet 的 Opera Mobile。可能是什么错误?
      • 在我的情况下,用户没有询问他们的内容,getAccounts() 只是返回一个空数组。
      • @Mergasov 你误读了我的回答。我只是对其进行了编辑,以便那些复制/粘贴而不阅读它的人复制正确的内容。
      【解决方案4】:

      我也有你的问题... 按 F12 进入您的控制台,注意在您的 Localhost 选项卡中(对我来说是 localhost:3000),然后在您的控制台中写入“ethereum.enable().then(console.log)”。然后你可以连接到元掩码。 祝你好运兄弟;)

      【讨论】:

        【解决方案5】:

        很简单,你只需要在浏览器中启用以太坊,你可以这样做: 只需添加“await window.ethereum.enable();”

             const getData = async () => {
                const web3 = new Web3(Web3.givenProvider);
                const network = await web3.eth.net.getNetworkType();
                await window.ethereum.enable();
                const accounts = await web3.eth.getAccounts();
                setAccount(accounts[0]);
                console.log("TCL: getData -> network", network);
                console.log("TCL: getData -> accounts", accounts);
              };
        

        【讨论】:

        • 非常感谢,它对我有用。我刚刚添加了 await window.ethereum.enable();到一个异步函数。
        • 这是我的解决方案。谢谢
        【解决方案6】:

        默认情况下 Metamask 似乎不再公开帐户,因此如果您想访问它们,您需要向用户询问权限。你可以在这个announcement看到详细信息

        长话短说,将您的 web3.js 文件更新为:

        import Web3 from 'web3';
        
        const web3 = new Web3(window.web3.currentProvider);
        
        window.addEventListener("load", async () => {
          // Modern dapp browsers...
          if (window.ethereum) {
            window.web3 = new Web3(window.ethereum);
            try {
              // Request account access if needed
              await window.ethereum.enable();
            } catch (error) {
              // User denied account access...
            }
          }
          // Legacy dapp browsers...
          else if (window.web3) {
            window.web3 = new Web3(web3.currentProvider);
          }
          // Non-dapp browsers...
          else {
            console.log("Non-Ethereum browser detected. You should consider trying MetaMask!");
          }
        });
        
        export default web3;
        

        【讨论】:

        • 这行得通。它将弹出元掩码并要求连接到页面。之后,它将从 metamask 中检索帐户地址。
        • 我仍然遇到同样的错误
        【解决方案7】:

        而不是const web3 = new Web3(window.web3.currentProvider);, 你能试试吗

        const web3 = new Web3(new Web3.providers.HttpProvider(`http://127.0.0.1:7545`));
        

        我假设你在端口 7545 上本地运行以太坊

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-11
          • 2020-08-26
          • 2021-03-24
          • 2019-07-19
          • 2018-12-19
          • 1970-01-01
          • 1970-01-01
          • 2019-08-15
          相关资源
          最近更新 更多