getAccount () в web3 выдает две разные ошибки в двух разных браузерах - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь следовать учебному пособию и получаю две разные ошибки:

в chrome:

"Необработанное отклонение (TypeError): Невозможно прочитать свойство then для неопределенного"

в Firefox:

необработанное отклонение (ошибка типа): web3.eth.getAccounts (...) не определено

myкод прост, это реактивный проект с провайдером локального хоста, использующий Ganache и npm:

 async loadBlockchainData(){
  const web3 = await window.web3
  const acc = await web3.eth.getAccounts().then(console.log);      
  this.setState({account: acc[0]})

Почему getAccounts возвращает undefined в первую очередь? и почему chrome выдает эту ошибку, а firefox нет?

моя метамаска вошла в оба браузера (и приняла соединение)

версия web3: web3@1.0.0-beta.55

РЕДАКТИРОВАТЬ: вот как яинициализированный web3:

 async componentWillMount(){
 await this.loadWeb3();
 await this.loadBlockchainData();
    }    
  async loadWeb3() {

   window.addEventListener('load', async () => {
     if (window.ethereum) {
       window.web3 = new Web3(window.ethereum);
       await window.ethereum.enable();

     } 

     else if (window.web3) {
      window.web3 = new Web3(window.web3.currentProvider);

     }

     else {
      console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
     }
   });

}

1 Ответ

1 голос
/ 11 октября 2019

Наиболее вероятная причина - неправильная инициализация web3. Если вы используете metamask, то инициализируйте web3 следующим образом:

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

И в начале импорта файла Web3.

import Web3 from 'web3';

Также будьте особенно осторожны счтобы смешать прописные буквы Web3 со строчными буквами web3.

Редактировать после редактирования вопроса и комментировать

Я не знаю, какой урок вы читаете. Но вам не нужно await на window.web3 в loadBlockchainData() и вам не нужно listen при загрузке окна в loadWeb3().

Упрощенно loadWeb3()

async loadWeb3() {
    if (window.ethereum) {
        window.web3 = new Web3(window.ethereum);
        await window.ethereum.enable();
    } else if (window.web3) {
        window.web3 = new Web3(window.web3.currentProvider);
    } else {
        console.log("Non-Ethereum browser detected. You should consider trying MetaMask!");
    }
}

и loadBlockchainData()

async loadBlockchainData() {
    const web3 = window.web3;
    const acc = await web3.eth.getAccounts();
    this.setState({ account: acc[0] });
}

web3 версия 1.2.1 и реагирующая версия 16.10.2

...