MetaMask 不注入 window.ethereum:未捕获(承诺中)TypeError:无法读取未定义的属性“请求”

Ble*_*ADN 9 javascript browser ethereum web3js metamask

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

<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 16

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

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


Ble*_*ADN 3

解决了谜题,似乎就像错误代码显示的那样

Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
Run Code Online (Sandbox Code Playgroud)

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

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

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

结论

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