Поставщик не указан или недействителен в метамаске

Я использую метамаску для подключения к сети rinkeby. Я вижу, что метамаска отлично вводит код web3, но я все равно получаю файл Error: Provider not set or invalid. Вот js-скрипт, который я написал.

var Web3 = require('web3');
var web3 = new Web3();

if (typeof web3 !== 'undefined') {
    console.log("Using web3 detected from external source like Metamask");
    web3 = new Web3(web3.setProvider(web3.currentProvider));

} else {
    console.log("Using localhost");
    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

var account = web3.eth.accounts[0];

console.log(account);

Вот ошибка, которую я получаю

введите описание изображения здесь

Я использую веб-пакет, web3 0.20.4. Как мне это решить?

Ответы (1)

На самом деле вам не следует устанавливать провайдера в new Web3экземпляре, если у вас уже есть файл web3.currentProvider.

Заменять:

web3 = new Web3(web3.setProvider(web3.currentProvider));

с:

web3 = new Web3(web3.currentProvider);

Кроме того, не создавайте web3экземпляр до проверки версии браузера.

Замените строку:

var web3 = new Web3();

с:

var web3 = window.web3;
Спасибо, это сработало. Эта линия var web3 = new Web3();используется во многих учебниках, и она сработала для них. Я новичок в js. Можете ли вы сказать мне, что происходит в этой var web3 = window.web3;строке?
@UchihaMadara Используя это var web3 = new Web3(), вы фактически перезаписываете опцию проверки версии браузера. Ваша typeof web3 !== 'undefined'проверка будет правильно проверять версию браузера/метамаски только в том случае, если вы это сделали typeof window.web3 !== 'undefined'. Также не имело особого смысла инициировать экземпляр new Web3во второй строке, когда if/elseэто все равно делает ваш оператор.
@ReyHaynes это не работает и даже выдает дополнительную ошибку с вашими предложениями