Solidity
無法在松露測試中記錄結構成員
契約:
mapping (bytes32 => MyStruct) public myMapping; struct MyStruct { uint256 myMember; uint256 someOtherMember; }
測試(松露)
這有效:
let myStructResult = await this.contract.myMapping(id); console.log(myStructResult);
但是記錄不熟悉的輸出(我對BN lib不太熟悉):
Result { '0': '0x0000000000000000000000000000000000000000', '1': BN { negative: 0, words: [ 5, <1 empty item> ], length: 1, red: null }, myMember: BN { negative: 0, words: [ 5, <1 empty item> ], length: 1, red: null }, someOtherMember: BN { negative: 0, words: [ 5, <1 empty item> ], length: 1, red: null},
我看到了我想要記錄的值
myMember
,以及一些我不明白它們的用途的整數鍵所以我去:
let myMemberResult = await this.contract.myMapping(id).myMember; let myMemberResultToNum = myMemberResult.toNumber() console.log(myMemberResult) Result: undefined console.log(myMemberResultToNum) Result: cannot read property 'toNumber' of undefined
為什麼我可以記錄結構,但不能記錄其中一個成員?
在:
let myMemberResult = await this.contract.myMapping(id).myMember;
該
this.contract.myMapping(id).myMember
部分在該部分之前執行await
。您可以通過添加括號來修復它:
let myMemberResult = (await this.contract.myMapping(id)).myMember;
順便說一句,您可以從問題下方您自己的評論中描述的實驗輕鬆得出結論。
作為旁注,我建議不要轉換
BN
為Number
,因為後者受Number.MAX_SAFE_INTEGER
(2 ^ 53 - 1) 的約束。如果您想將其列印為純十進制數,則只需使用
myMemberResult.toString()
, 或更好(為了避免極大值的科學記數法) -myMemberResult.toFixed()
。