MetaMask does not inject window.ethereum: Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
MetaMask does not inject window.ethereum: Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
首先,让我提一下这是一个浏览器内项目,所以我只能使用
<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 上批准 metamask 后输出 metamask 用户的地址,但是我收到错误
Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
错误只是说,如果我必须添加提供程序,我的实际目标是使用元掩码中的提供程序,并允许连接到元掩码,其余功能,如传输或我知道如何使用的其他功能处理它们,似乎我的问题是在我尝试加载页面时出现的。
我没有要使用的以太节点,也不打算使用 nodejs,只有一个显示 Metamask 地址的 html 文件,因此使用浏览器内的 web3js。
我希望只是我没有意识到一些简单的事情,因为我似乎无法找到我现在无法使用 web3js 的原因。
解开了谜团,好像和错误码显示的一样
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 需要普通主机才能注入,它不会注入在您自己的工作站上打开的随机文件。
实际问题是,您需要 到 运行 某些服务器 上的脚本。出于测试目的,您可以使用 localhost。
请参阅此了解如何启动本地服务器。只需通过 localhost:XXXX 打开您的文件,其中 XXXX - 是端口号。
我遇到了完全相同的问题,结果发现我的 HTML 有点不可靠(在 <html>
标签之前有一个额外的标签),这阻止了 MetaMask 注入 web3。
首先,让我提一下这是一个浏览器内项目,所以我只能使用
<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 上批准 metamask 后输出 metamask 用户的地址,但是我收到错误
Uncaught (in promise) TypeError: Cannot read property 'request' of undefined
错误只是说,如果我必须添加提供程序,我的实际目标是使用元掩码中的提供程序,并允许连接到元掩码,其余功能,如传输或我知道如何使用的其他功能处理它们,似乎我的问题是在我尝试加载页面时出现的。
我没有要使用的以太节点,也不打算使用 nodejs,只有一个显示 Metamask 地址的 html 文件,因此使用浏览器内的 web3js。
我希望只是我没有意识到一些简单的事情,因为我似乎无法找到我现在无法使用 web3js 的原因。
解开了谜团,好像和错误码显示的一样
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 需要普通主机才能注入,它不会注入在您自己的工作站上打开的随机文件。
实际问题是,您需要 到 运行 某些服务器 上的脚本。出于测试目的,您可以使用 localhost。
请参阅此
我遇到了完全相同的问题,结果发现我的 HTML 有点不可靠(在 <html>
标签之前有一个额外的标签),这阻止了 MetaMask 注入 web3。