Anbieter in Metamaske nicht festgelegt oder ungültig

Ich verwende Metamask, um eine Verbindung zum Rinkeby-Netzwerk herzustellen. Ich kann sehen, dass Metamask Web3-Code einfügt, aber ich bekomme immer noch die Error: Provider not set or invalid. Hier ist das js-Skript, das ich geschrieben habe.

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);

Hier ist der Fehler, den ich bekomme

Geben Sie hier die Bildbeschreibung ein

Ich verwende Webpack, web3 0.20.4. Wie löse ich das?

Antworten (1)

Sie sollten eigentlich keinen Anbieter innerhalb einer new Web3Instanz festlegen, wenn Sie bereits über die web3.currentProvider.

Ersetzen:

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

mit:

web3 = new Web3(web3.currentProvider);

Erstellen Sie die Instanz auch nicht, web3bevor Sie die Browserversion überprüft haben.

Ersetzen Sie die Zeile:

var web3 = new Web3();

mit:

var web3 = window.web3;
Danke hat funktioniert. Die Zeile var web3 = new Web3();wird in vielen Tutorials verwendet und hat für sie funktioniert. Ich bin ziemlich neu in Sachen js. Können Sie mir sagen, was in dieser var web3 = window.web3;Zeile passiert?
@UchihaMadara Wenn Sie das verwenden var web3 = new Web3(), überschreiben Sie im Grunde die Option, nach der Browserversion zu suchen. Ihre typeof web3 !== 'undefined'Überprüfung würde die Browser-/Metamaskenversion nur dann ordnungsgemäß überprüfen, wenn Sie dies tun würden typeof window.web3 !== 'undefined'. Es machte auch nicht viel Sinn, eine new Web3Instanz in der zweiten Zeile zu initiieren, wenn Ihre if/elseAnweisung dies sowieso tut.
@ReyHaynes es funktioniert nicht und wirft sogar einen zusätzlichen Fehler mit Ihren Vorschlägen