You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PUBLIC_requestAccounts请求已挂起,钱包连接失败技术求助

解决"来自http://localhost:3000的'PUBLIC_requestAccounts'类型请求已处于待处理状态,请等待"错误

这个错误的核心原因是同一来源(http://localhost:3000)发起了重复的eth_requestAccounts请求,钱包(如MetaMask)会限制同一来源的并行请求——当已有一个请求处于待处理状态(比如用户还未在钱包弹窗中确认/拒绝)时,再次发起请求就会触发该报错。

从你的代码和控制台输出来看:

  • 代码执行了console.log("11")和console.log("22"),说明connect()被调用,但await后的console.log("account:", account)没有输出,证明请求卡在了pending状态,后续又触发了重复请求导致报错。
  • 你的代码没有做请求防重复处理,也没有捕获异步请求的异常,大概率存在多次执行这段连接逻辑的情况(比如组件重复渲染、事件多次绑定)。

1. 添加请求防重复标记

新增状态变量标记当前是否正在连接钱包,避免重复发起请求:

// 全局或组件内的状态,标记是否正在连接钱包
let isConnecting = false;

if (window.ethereum) {
    console.log("11");
    const connect = async () => {
        // 如果已有请求在处理,直接返回
        if (isConnecting) return;
        isConnecting = true;
        
        try {
            const account = await window.ethereum.request({
                method: "eth_requestAccounts",
            });
            console.log("account:", account);
        } catch (error) {
            // 捕获并处理错误:比如用户拒绝授权、请求超时等
            console.error("钱包连接失败:", error);
        } finally {
            // 无论成功失败,重置连接状态
            isConnecting = false;
        }
    };
    connect();
    console.log("22");
}

2. 排查重复触发逻辑

  • 检查页面中是否有多个地方调用了钱包连接代码,比如按钮多次绑定点击事件、前端组件未做挂载控制导致重复执行。
  • 如果使用React等框架,确保连接逻辑只在组件挂载时执行一次:
import { useEffect } from 'react';

function WalletConnect() {
    useEffect(() => {
        let isConnecting = false;
        if (window.ethereum) {
            const connect = async () => {
                if (isConnecting) return;
                isConnecting = true;
                try {
                    const account = await window.ethereum.request({ method: "eth_requestAccounts" });
                    console.log("account:", account);
                } catch (err) {
                    console.error(err);
                } finally {
                    isConnecting = false;
                }
            };
            connect();
        }
    }, []); // 空依赖确保只执行一次

    return <div>连接钱包</div>;
}

3. 钱包端排查

  • 打开MetaMask扩展,检查是否有被遮挡的授权弹窗或残留的待处理请求,关闭后重新尝试。
  • 在MetaMask的「设置」→「已授权网站」中,移除http://localhost:3000,然后重新发起连接请求。

内容的提问来源于stack exchange,提问作者justin522

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:25:08