当我在浏览器中切换 Metamask 地址时,Web3 getAccounts 不更新

Posted

技术标签:

【中文标题】当我在浏览器中切换 Metamask 地址时,Web3 getAccounts 不更新【英文标题】:Web3 getAccounts doesn't update when I switch Metamask addresses in browser 【发布时间】:2021-12-26 08:09:40 【问题描述】:

我有一个连接到基本前端的节点应用程序,服务器中的get 调用之一是获取用户的地址。它是第一次工作,但是,当我在网站的 Metamask 插件中手动切换地址/帐户时,它不会更新,而是停留在旧地址上。

作为参考,我只是使用并连接到笔记本电脑上打开的 ganache 测试网络。

相关代码如下,先server.js

const express = require('express')
const app = express()
const port = 3000
const Web3 = require('web3');

const WEB3_PROVIDER = "HTTP://127.0.0.1:7545"
if (typeof web3 !== 'undefined') 
    web3 = new Web3(web3.currentProvider);
    console.log("web3 already initialized.");
 else 
    // set the provider you want from Web3.providers
    web3 = new Web3(new Web3.providers.HttpProvider(WEB3_PROVIDER));
    console.log("New web3 object initialized.");


app.get('/', (req, res) => 
  res.sendFile('./main.html',  root: __dirname );
)

app.listen(port, () => 
  console.log(`Example app listening at http://localhost:$port`)
)

app.get('/get-account', async (_req, res) => 
    try 
        web3.eth.getAccounts().then(function(accs) 
            this_acc = accs[0];
            console.log("account :: "); console.log(this_acc); 
            return res.send(this_acc);
        )
    
     catch (e)  throw e; 
);

然后main.html页面调用client.js,其相关sn-p如下:

async function updateUserAddr() 
    console.log("updateUserAddr");
    const response = await fetch('/get-account');
    var addr_str = await response.text();
    console.log(addr_str);
    $('#address_id_poster').text(addr_str);


updateUserAddr();

第一次运行它会记录正确的地址,让我在 html 页面上显示它。但随后我从 Metamask 中删除了该帐户,添加了一个不同的帐户,然后重新启动并刷新它会显示相同的旧帐户。

为什么这段代码不会更新 Metamask 中的帐户更改?我怎样才能解决这个问题?非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

TI 认为,当浏览器下载任何内容时,它会缓存,而 fetch() 也会缓存结果。更改 fetch 的选项:

const response = await fetch(url, 
    method: 'GET',
    // this should invalidate caching
    cache: 'no-cache',     
    
  );

这应该在您每次刷新页面时发出一个新请求

【讨论】:

以上是关于当我在浏览器中切换 Metamask 地址时,Web3 getAccounts 不更新的主要内容,如果未能解决你的问题,请参考以下文章

检测到非以太坊浏览器。您应该考虑尝试 MetaMask

MetaMask 地址与以太坊格式地址

Metamask插件中-添加网络和切换网络

Metamask插件中-添加网络和切换网络

Metamask添加网络和切换网络

无法在 metamask 移动浏览器中加载 dapp