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 ------
现在尝试做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 ------