Zugriff auf Ereignisse von nodejs: Eigenschaft „on“ von undefined kann nicht gelesen werden

Dies ist mein Quellcode in 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);
    });

Aber ich bekomme diesen Absturz:

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)

Vertrag.Evt ist für mich undefiniert, Vertrag ist definiert und enthält Vertrag.Ereignisse.Evt.

Wie kann ich das beheben?

Hallo! Haben Sie es mit contract.evt versucht?
Vertrag.Evt ist undefiniert
mmm Ist die Vertragsvariable definiert? Versuchen Sie alternativ Folgendes: var contract = web3.eth.contract(abi); var vertragsinstanz = vertrag.at(adresse);
Die von Ihnen vorgeschlagene Syntax funktioniert nicht mit dem von mir verwendeten Paket: npmjs.com/package/web3 Es hat eine etwas andere API als beispielsweise Metamask: web3js.readthedocs.io/en/1.0/index.html

Antworten (1)

Es gibt zwei Versionen der Web3-API, die alte (von Metamask verwendet) und die neue (von der neuesten Web3 von nodejs verwendet). Dies ist ein Beispiel für die letzte Version der API. Um auf Ereignisse zu lauschen, muss Websocket funktionieren (http würde nicht funktionieren), also führen Sie mist.exe mit den folgenden Optionen aus:

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

So können Sie sich jetzt mit Ihrer geth.exe verbinden:

    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)
        });
};