web3 的映射结构 return null

the mapping struct return null by web3

现在尝试做solidity保存struct数据,在web3接口中通过mapping string获取数据

现在我已经完成了数据保存部分,我可以在我的 Remix API 中获取数据,但是如果我想通过 web3 获取数据,它将 return null as以下:

web3的版本是1.3.4。我曾经尝试过是否可以 return 保存数据功能中的数据并且它有效,因此我猜测数据不被web3中的功能共享...

我发现了这个,但我仍然无法得到解决方案。

代码如下:

pragma solidity >=0.7.0 <0.9.0;

contract Storage{
    string b = "calculation a";
    
    struct UserInfo {
        string time;
        uint emission;
    }
    mapping (string => UserInfo) public users;

    function saveData(string memory input_time, string memory input_source, string memory input_mycalculate, uint input_material) public{
        users[input_source].time = input_time;
        if (keccak256(abi.encodePacked(input_mycalculate)) == keccak256(abi.encodePacked(b)))
            users[input_source].emission = input_material * 3 / 2;
        else
            users[input_source].emission = input_material * 5 / 2;
    }
    
    function search(string memory input_source) public view returns (UserInfo memory) {
        return users[input_source];
    }
} 

下面是显示数据的js代码:

contract.methods.search(input_company).call({from:web3.eth.defaultAddress})
  .then((result) => {
        console.log(result)
        companyResultLineChart.innerHTML += result[0] + result[1]
  })

应该是时间问题。它是一个异步 JavaScript 代码,因此您必须使用“.then”或等待。在您的代码示例中,您使用的是“.then”。我使用带有“60sec”、“test_src”、“calc”、“10”的 saveData 函数进行测试。所以下面的代码:

console.log("------ before then ------ ")
let innerHTML = "HTML "
contract.methods.search("test_src").call().then((result) => {
   console.log(innerHTML)
   innerHTML += result[0] + result[1] 
   console.log(result)
   console.log(innerHTML)
   
})

console.log("------ after then ------ ")

将在控制台中输入:

------ before then ------ 
------ after then ------ 
HTML 
[ "60sec", "25" ]
HTML 60sec25

代码等待:

console.log("------ before await ------ ")
let innerHTML2 = "HTML "
let result_async = await contract.methods.search("test_src").call();
console.log(innerHTML2)
innerHTML2 += result_async[0] + result_async[1] 
console.log(result_async)
console.log(innerHTML2)
console.log("------ after await ------ ")

将在控制台中输入:

------ before await ------ 
HTML 
[ "60sec", "25" ]
HTML 60sec25
------ after await ------