Web3js
如何檢查使用者是否已登錄 Metamask?
我嘗試了一個非常簡單的 web3 範例,如果您登錄 Metamask 並嘗試發送一些 ETH,它就可以工作。
但是,如果我沒有登錄 Metamask,則不會顯示任何錯誤和提示。
如何檢查使用者是否已登錄 Metamask?
<html> <head> <title>Introduction to Dapps. Simple MetaMask example.</title> </head> <body> <div id="meta-mask-required"></div> <fieldset> <label> Ether: <input type="text" id="amount"></input> </label> <button onclick="send()">Donate to the Author</button> <div id="response"></div> </fieldset> <script> // MetaMask injects the web3 library for us. window.onload = function() { if (typeof web3 === 'undefined') { document.getElementById('meta-mask-required').innerHTML = 'You need <a href="https://metamask.io/">MetaMask</a> browser plugin to run this example' } } function send() { web3.eth.sendTransaction({ from: web3.eth.coinbase, to: '0xA7b25444868Cc0e6AcFd81852b3bc3F335933760', value: web3.toWei(document.getElementById("amount").value, 'ether') }, function(error, result) { if (!error) { document.getElementById('response').innerHTML = 'Success: <a href="https://testnet.etherscan.io/tx/' + result + '"> View Transaction </a>' } else { document.getElementById('response').innerHTML = '<pre>' + error + '</pre>' } }) } </script> </body> </html>
我解決這個問題的方法是呼叫
web3.eth.getAccounts()
如果它返回一個空數組,實際上意味著使用者沒有登錄到 MetaMask:
web3.eth.getAccounts(function(err, accounts){ if (err != null) console.error("An error occurred: "+err); else if (accounts.length == 0) console.log("User is not logged in to MetaMask"); else console.log("User is logged in to MetaMask"); });
MetaMask 將不再注入
web3
,因此依賴它不是一個好習慣。我使用了
ethers.js
圖書館。我必須使用 rollup.js 將其引入我的項目,但您也可以使用 bundler 或 webpack 或其他任何東西。const { ethereum } = window; if (ethereum) { var provider = new ethers.providers.Web3Provider(ethereum); } ... const isMetaMaskConnected = async () => { const accounts = await provider.listAccounts(); return accounts.length > 0; } await isMetaMaskConnected().then((connected) => { if (connected) { // metamask is connected } else { // metamask is not connected } });