Solidity 函数将空数组返回给 web3.js

Posted

技术标签:

【中文标题】Solidity 函数将空数组返回给 web3.js【英文标题】:Solidity function returns empty array to web3.js 【发布时间】:2019-08-15 09:50:42 【问题描述】:

Solidity 函数在 Remix 和 truffle 控制台上执行时返回一个字符串数组,而从 JS 调用时它返回一个空数组

实体代码

mapping(address => string[]) addressLink;
function getLinks(address a) public view returns (string[] memory)
  
    return addressLink[a];
  

JS代码

contract.methods.getLinks(accounts[0]).call().then(res => 
                 console.log(res)
             );

从 JS 调用时松露控制台结果和预期结果

[ 'QmTiMLN8X4NE4ho5mqJ9t4bJ17JxfMHAFcg3z66f8vdUh1' ]

浏览器控制台上的结果(实际结果)

[""]
0: ""
length: 1

【问题讨论】:

如果合同是本地的?你确定你在从 web3js 获取之前已经设置了字符串吗? 是的,联系人是本地人。我已经通过 web3 设置了字符串,并首先尝试从控制台检索,这给出了预期的结果,当从 web3 调用时,它返回一个空数组 你能显示完整的代码吗?我需要看看你是如何从 web3 获得合同的。 无法在此处粘贴完整代码。获取实例pastebin.com/mrjEmRmm 的片段 pastebin.com/vh5A2J6f 【参考方案1】:

您可能在 javascript 代码中设置了错误的合约地址:

 const instance = new web3.eth.Contract(
  SimpleStorageContract.abi,
  deployedNetwork && deployedNetwork.address,
 );

第二个参数为合约地址,见:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#new-contract

希望对你有帮助。

【讨论】:

即使将第二个参数仅替换为合同的地址也无济于事(我从生成的 JSON 文件中获取地址,因此地址点没有错误)。我所有的其他功能都可以正常工作。只有这个函数返回一个空数组【参考方案2】:

web3.js 库中存在错误。已在最新的 beta 版本中关闭

【讨论】:

以上是关于Solidity 函数将空数组返回给 web3.js的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 过程将空结果返回给 PHP

将空列表传递给函数以收集结果

将空范围传递给采用一对迭代器的函数的简洁/简洁的方法是啥?

将空数组作为可选参数的默认值传递[重复]

将空数组发送到 webapi

通过服务器功能将空值返回给Apps Script webapp以获取某个电子表格