使用Solidity与Web3调用事件get()返回undefined的技术求助
解决调用Solidity事件get()方法返回undefined的问题
你遇到的myEvent: undefined问题,大概率是几个常见的细节疏漏导致的,咱们一步步来排查修复:
1. 先确认合约中触发了事件
你的Solidity代码片段里setMessage函数没写完,这很可能是核心问题!在Solidity中,事件不会自动触发,必须在函数里显式调用事件才能生成链上日志。补全后的合约函数应该是这样:
pragma solidity ^0.4.18; contract EthProj { string fName; string age; event Message(string name, string age); function setMessage(string _fName, string _age) public { fName = _fName; age = _age; // 必须添加这行代码,主动触发事件 Message(_fName, _age); } }
如果没加触发事件的代码,哪怕你调用了setMessage,链上也不会生成Message事件的日志,get()方法自然拿不到任何数据,最终返回undefined。
2. 修正Web3.js的事件结果处理逻辑
在对应Solidity 0.4.x版本的Web3.js v0.x中,get()方法返回的是事件对象的数组,而非单个事件对象。你直接访问eventResult.args会报错,因为数组本身没有args属性。正确的处理方式应该是先判断数组是否有数据,再遍历或取单个元素:
EthProj.Message({}, { fromBlock: 0, toBlock: 'latest' }).get((error, eventResults) => { if (error) { console.log('Error in Message event handler: ' + error); return; } // 先判断是否存在事件日志 if (eventResults.length === 0) { console.log('No Message events found on chain'); return; } // 遍历所有事件结果(如果有多次触发) eventResults.forEach(event => { console.log('Message event args: ' + JSON.stringify(event.args)); }); });
你之前的代码直接用eventResult.args,当eventResults是空数组时,自然会得到undefined。
3. 确认合约ABI包含事件定义
如果Web3.js实例化合约时使用的ABI没有包含Message事件的定义,Web3.js无法识别这个事件,也会导致获取失败。确保你的ABI里有这段事件描述:
{ "anonymous": false, "inputs": [ { "name": "name", "type": "string" }, { "name": "age", "type": "string" } ], "name": "Message", "type": "event" }
4. 最后检查基础配置
- 确认调用
setMessage的交易已经被打包到区块中(可以在区块浏览器查交易状态),如果交易还未确认,toBlock: 'latest'也查不到日志。 - 确保你实例化
EthProj合约时用的地址,和实际部署到链上的合约地址完全一致。
按照这几步排查,应该就能解决你遇到的undefined问题了。
内容的提问来源于stack exchange,提问作者Cal W
相关产品推荐
相关产品推荐

