TypeError: Eigenschaft „method“ kann nicht auf „undefined“ gesetzt werden, wenn WebsocketProvider verwendet wird

Ich benutze:

  • web3 v0.20.6
  • web3-Provider-ws v1.0.0-beta.34

Erste Frage - kann web3-providers-wsmit verwendet werden web3 v0.20.*?

Zweite Frage (Problem) - Ich erhalte eine Fehlermeldung, wenn ich wahrscheinlich versuche, eine Transaktion zu senden (das Lesen und Ansehen von Ereignissen über diesen Anbieter ist völlig in Ordnung).

Pull-Request: https://github.com/ethereum-alarm-clock/timenode-core/pull/146

Funktionierende HTTP-Anbieter-E2E-Tests:

https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823597

Fehlerhafte E2E-Tests des WS-Anbieters:

https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823603

Tatsächlicher Fehler:

5 passing (4s)
  3 failing
  1) ScheduleTx
       schedules a basic transaction:
     TypeError: Cannot set property 'method' of undefined
      at WebsocketProvider._addResponseCallback (node_modules/web3-providers-ws/src/index.js:197:39)
      at WebsocketProvider.send (node_modules/web3-providers-ws/src/index.js:252:10)
      at RequestManager.send (node_modules/web3/lib/web3/requestmanager.js:58:32)
      at Eth.get [as accounts] (node_modules/web3/lib/web3/property.js:107:62)
      at Object.<anonymous> (test/e2e/TestScheduleTx.ts:75:34)
      at Generator.next (<anonymous>)
      at fulfilled (test/e2e/TestScheduleTx.ts:4:58)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

Der einzige Unterschied zwischen HTTP-Anbieter und WS-Anbieter besteht darin, ws://localhost:5454anstelle von http://localhost:8545. RPC, mit dem ich spreche, ist ganache-cli 6.1.6.

Antworten (2)

Stellen Sie sicher, dass Sie ganache-cli@betainstalliert haben

Sie müssen beim Einstellen des Anbieters um den sendund das sendAsyncProblem herumhacken.

So:

export const setProvider = (provider: any) => 
    Contracts.concat(HumanFriendlyToken).forEach((contract) => {
        contract.setProvider(provider)
        if (typeof contract.currentProvider.sendAsync !== "function") {
            contract.currentProvider.sendAsync = function() {
                return contract.currentProvider.send.apply(contract.currentProvider, arguments)
            }
        }
    })

^ Stellen Sie sicher, dass Sie KEINEN Pfeil () => Funktion oben verwenden, da dies an den Bereich gebunden ist, und das wollen wir nicht.

Sollte danach funktionieren

Ist Ihnen bewusst, dass die API für RPC und WS unterschiedlich ist? Nicht sicher, ob Ganache dies unterstützt, mit dem "normalen" Geth müssen Sie es wie starten geth --ws. Dadurch wird die Websocket-API 8546standardmäßig an den Port gebunden.