web3.js 中结构映射的访问映射
Access mapping of mapping of structs in web3.js
假设我有这样的数据结构布局:
struct ReviewStruct {
string rating;
...
}
struct Restaurant {
...
uint reviewCount;
mapping(uint => ReviewStruct) reviews;
}
uint public restaurantCount = 0;
mapping(uint => Restaurant) public restaurants;
然后,当我尝试访问我的 JS 应用程序中的内容时,它可以工作,但如果我尝试访问实际评论则不行:
const restaurantCount = await review.methods.restaurantCount().call() // works
const restaurant = await review.methods.restaurants(2).call() // works
const reviewObj = await review.methods.restaurants(2).reviews(0).call() // throws an error
如何访问映射内部的映射(两者都与结构相关)?
在旧的 ABI v1 编码中,public 函数无法返回结构,包括为您的映射自动生成的结构。这根本不可能。您需要创建自己的访问器函数,将 returns 字段值作为元组(值列表)或使用 supports ABI v2 encoding.
的工具链
此外,我不确定是否会为映射的映射自动生成访问器函数,因此您最终可能会在任何情况下编写自己的函数。
假设我有这样的数据结构布局:
struct ReviewStruct {
string rating;
...
}
struct Restaurant {
...
uint reviewCount;
mapping(uint => ReviewStruct) reviews;
}
uint public restaurantCount = 0;
mapping(uint => Restaurant) public restaurants;
然后,当我尝试访问我的 JS 应用程序中的内容时,它可以工作,但如果我尝试访问实际评论则不行:
const restaurantCount = await review.methods.restaurantCount().call() // works
const restaurant = await review.methods.restaurants(2).call() // works
const reviewObj = await review.methods.restaurants(2).reviews(0).call() // throws an error
如何访问映射内部的映射(两者都与结构相关)?
在旧的 ABI v1 编码中,public 函数无法返回结构,包括为您的映射自动生成的结构。这根本不可能。您需要创建自己的访问器函数,将 returns 字段值作为元组(值列表)或使用 supports ABI v2 encoding.
的工具链此外,我不确定是否会为映射的映射自动生成访问器函数,因此您最终可能会在任何情况下编写自己的函数。