Доступ к событиям из nodejs: невозможно прочитать свойство «on» неопределенного

Это мой исходный код в nodejs:

var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
var abi = ...
var contract = new web3.eth.Contract(abi, MAIN_CONTRACT_ID);
contract.events.Evt({fromBlock: 0, toBlock: 'latest'},function () {
}).on('data',function (evt) {
        console.log("evt",evt);
    });

Но я получаю этот сбой:

TypeError: Cannot read property 'on' of undefined
    at Subscription.subscribe (C:\Users\steve\Dropbox\Projects\dsd\dsd\web3test\node_modules\web3\packages\web3-core-subscriptions\src\subscription.js:199:45)
    at Contract._on (C:\Users\steve\Dropbox\Projects\dsd\dsd\web3test\node_modules\web3\packages\web3-eth-contract\src\index.js:623:18)

контракт.Evt для меня не определен, контракт определен и содержит contract.events.Evt.

Как я могу это исправить?

Привет! Вы пробовали Contract.Evt?
контракт.Evt не определен
mmm Определена ли переменная контракта? В качестве альтернативы попробуйте следующее: var contract = web3.eth.contract(abi); var contractInstance = contract.at (адрес);
Предложенный вами синтаксис не работает с пакетом, который я использую: npmjs.com/package/web3 Он имеет немного другой API по сравнению, например, с метамаской: web3js.readthedocs.io/en/1.0/index.html

Ответы (1)

Существует две версии API web3: старая (используется метамаской) и новая (используется последней версией web3 из nodejs). Это пример для последней версии API. Чтобы прослушивать события, вам нужно, чтобы работал веб-сокет (http не будет работать), поэтому запустите mist.exe со следующими параметрами:

--node-wsorigins="*" 
--node-ws 
--node-wsapi "db,eth,net,web3,personal" 
--swarmurl="http://swarm-gateways.net"

Вот как вы можете подключиться к вашему geth.exe сейчас:

    var Web3 = require('web3');
    var web3 = new Web3('ws://localhost:8546');
    var abi = ...
    contract = new web3.eth.Contract(abi, CONTRACT_ID_HERE);
    // this will listen to new events
    contract.events.Evt({}, function (err, evt) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(evt)
    });
    // this will grab all events from the past
    contract.getPastEvents('Evt', {fromBlock: startBlock, toBlock: 'latest'}, 
       function (err, arg) {
            if(err) {
                console.error(err);
                return;
            }
            console.log(arg)
        });
};