MetaMask 不注入 window.ethereum: Uncaught (in promise) TypeError: Cannot read property 'request' of undefined

时间:2021-01-20 02:43:20

标签: javascript browser ethereum web3js metamask

首先,让我提一下这是一个浏览器内项目,所以我只能使用

<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>

所以几个月前我做了一个 dapp,即使我从未设置过提供者,它也能正常工作,所以我猜它使用了 MetaMask 提供的那些。 但是,我正在使用指南 here,唯一的问题是以下代码,

var account_global, connected = false;

async function connect() {
    if (!connected) {
        var wei;
        const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); // Waits for connection to MetaMask.
        account_global = accounts[0];
        web3.eth.defaultAccount = account_global;
        console.log(account_global.toString() + " connected!");
        connected = true;
        console.log(account_global);
    }
}

connect();

此代码用于在他们批准我的 dapp 上的元掩码后输出元掩码用户的地址,但是我收到错误

Uncaught (in promise) TypeError: Cannot read property 'request' of undefined

错误只是说,如果我必须添加提供者,我的实际目标就是使用元掩码中的提供者,并允许连接到元掩码,其余功能,例如传输或其他我知道如何处理它们,当我尝试加载页面时,我的问题似乎出现了。

我没有可以使用的以太节点,也不打算使用 nodejs,只有一个显示 Metamask 地址的 html 文件,因此使用浏览器内的 web3js。

我希望只是我没有意识到一些简单的事情,因为我似乎找不到我现在不能使用 web3js 的原因。

2 个答案:

答案 0 :(得分:3)

实际问题是,您需要在某些服务器上运行您的脚本。出于测试目的,您可以使用 localhost。

请参阅此 link 以了解如何启动本地服务器。只需通过 localhost:XXXX 打开您的文件,其中 XXXX - 是端口号。

答案 1 :(得分:-1)

解开了谜团,好像和错误代码显示的一样

Uncaught (in promise) TypeError: Cannot read property 'request' of undefined

真正意味着 window.ethereum 未定义,因此 MetaMask 没有确切原因不会注入以太坊,注意到在阅读 Metamask 和 Web3js 文档后,我的问题与他们的代码无关,事实上我要去最终使用此答案中显示的代码。

https://ethereum.stackexchange.com/a/78987

问题似乎无论浏览器 Metamask 都不会注入,所以我在通常需要 Metamask 连接的多个网站和其他正常站点(如 google.com)上对其进行了测试,令我惊讶的是,每个站点都会将 Metamask 注入以太坊来自我自己的测试站点,所以这意味着我的站点被诅咒了,或者只是因为 Metamask 没有注入到非托管网站(只是在我的 destop 上测试了文件),而是在它确实注入的实际主机上我的测试是在这些网站上进行的。

结论

Metamask 需要普通主机才能注入,它不会注入到您自己工作站上打开的随机文件。