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
相关产品推荐
相关产品推荐

