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

Blazor JSInterop调用MetaMask相关JS函数无返回值及报错问题

问题分析与修复方案

问题1:拒绝连接时出现Cannot read properties of undefined (reading '0')错误

你的JavaScript代码中条件判断逻辑错误:if (accounts.length != 0 || accounts != undefined) 会先执行accounts.length,如果accounts是undefined,直接触发读取length的错误。因为逻辑或||只要前面的表达式为真就不会执行后面的,但如果accounts是undefined,前面的accounts.length会直接抛出错误,根本到不了判断accounts != undefined的步骤。

问题2:接受连接时返回空字符串

一方面是JavaScript的返回逻辑存在疏漏,另一方面你的C#代码中Console.WriteLine的写法错误,Console.WriteLine("output = ", output);不会正确输出output的值,导致你误以为返回空。


修复后的JavaScript代码

window.getAccount = async function () {
    try {
        const accounts = await provider.request({ method: "eth_requestAccounts" });
        console.log("accounts = ", accounts);
        // 先判断accounts是否存在,再检查长度,用可选链避免报错
        if (accounts?.length > 0) { 
            console.log("account[0] = ", accounts[0]);
            return accounts[0]; // 返回第一个账户地址
        }
        return "未找到可用账户";
    } catch (err) {
        if (err.code === 4001) {
            console.log("Please connect to MetaMask.");
            return "请允许连接MetaMask";
        } else {
            console.error(err);
            return `连接出错: ${err.message}`;
        }
    }
}

修复点:

  • 用accounts?.length > 0替代原错误的条件判断,可选链操作符?.会在accounts为undefined时直接返回undefined,避免读取length的错误
  • 移除catch块中throw err后的无效return语句(throw之后代码不会执行)
  • 统一错误返回的提示信息

修复后的C#调用代码

string output = await JsRuntime.InvokeAsync<string>("getAccount");
// 修正Console.WriteLine的格式化写法,正确输出返回值
Console.WriteLine($"output = {output}");

修复点:

  • 使用字符串插值$"output = {output}"正确输出output的内容,原写法不会显示变量值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:21:05