Proveedor no configurado o no válido en metamask

Estoy usando metamask para conectarme a la red rinkeby. Puedo ver que metamask inyecta el código web3 muy bien, aún así obtengo el archivo Error: Provider not set or invalid. Aquí está el script js que escribí.

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

Aquí está el error que estoy recibiendo

ingrese la descripción de la imagen aquí

Estoy usando el paquete web, web3 0.20.4. ¿Cómo puedo solucionar esto?

Respuestas (1)

En realidad, no debería configurar un proveedor dentro de una new Web3instancia si ya tiene el archivo web3.currentProvider.

Reemplazar:

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

con:

web3 = new Web3(web3.currentProvider);

Además, no cree la web3instancia antes de verificar la versión del navegador.

Reemplace la línea:

var web3 = new Web3();

con:

var web3 = window.web3;
Gracias funcionó. La línea var web3 = new Web3();se usa en muchos tutoriales y funcionó para ellos. Soy bastante nuevo en cosas js. ¿ Puedes decirme qué está pasando en esta var web3 = window.web3;línea?
@UchihaMadara Al usar eso var web3 = new Web3(), básicamente sobrescribe la opción para verificar la versión de los navegadores. Su typeof web3 !== 'undefined'verificación solo verificaría correctamente la versión del navegador/metamask si lo hiciera typeof window.web3 !== 'undefined'. Tampoco tenía mucho sentido iniciar una new Web3instancia en la segunda línea cuando su if/elsedeclaración lo hace de todos modos.
@ReyHaynes no funciona e incluso arroja un error adicional con sus sugerencias