You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:45