Verwenden von web3.js
Version 1 (Beta) und Verwenden des WebsocketProviders zum Herstellen einer Verbindung über
const Web3 = require('web3')
const web3 = new Web3('ws://localhost:8546')
const provider = web3.providers.WebsocketProvider
const { connection } = provider
==> connection
istundefined
Wenn ich mir die Quelle für das anschaue, WebsocketProvider
kann ich sehen, dass es ein connection
Objekt hat
function WebsocketProvider(url) {
var _this = this;
this.responseCallbacks = {};
this.notificationCallbacks = [];
this.connection = new Ws(url);
this.addDefaultEvents();
// LISTEN FOR CONNECTION RESPONSES
this.connection.onmessage = function(e) {
/*jshint maxcomplexity: 6 */
var data = (typeof e.data === 'string') ? e.data : '';
_this._parseResponse(data).forEach(function(result){
var id = null;
// get the id which matches the returned id
if(_.isArray(result)) {
result.forEach(function(load){
if(_this.responseCallbacks[load.id])
id = load.id;
});
} else {
id = result.id;
}
// notification
if(!id && result.method.indexOf('_subscription') !== -1) {
_this.notificationCallbacks.forEach(function(callback){
if(_.isFunction(callback))
callback(null, result);
});
// fire the callback
} else if(_this.responseCallbacks[id]) {
_this.responseCallbacks[id](null, result);
delete _this.responseCallbacks[id];
}
});
};
}
Seltsamerweise kann ich den Quellcode dafür in GitHub nicht finden, das Obige kommt durch Protokollierungweb3.providers.WebsocketProvider
Lassen Sie mich jede Ihrer Fragen beantworten:
1. An welcher Stelle wird die Verbindung tatsächlich hergestellt
Die Verbindung wird tatsächlich hergestellt, nachdem ein WebsocketProvider-Objekt erstellt wurde. Nehmen Sie einen Ausschnitt aus Ihrem Beispiel:
const web3 = new Web3('ws://localhost:8546')
const provider = web3.providers.WebsocketProvider
const { connection } = provider
An diesem Punkt muss das Verbindungsobjekt noch initialisiert werden. Folgendes hätten Sie stattdessen tun sollen:
const provider = new web3.providers.WebsocketProvider('ws://localhost:8546')
const { connection } = provider
// then you can initialize your web3 with the provider like so
const web3 = new Web3(provider)
2. wie kann ich es so aussetzen, dass ich Fehler und andere Handler anhängen kann, um eine zuverlässigere Verbindung herzustellen, und
Jetzt haben Sie Zugriff auf das Verbindungsobjekt, Sie können Ihren eigenen Listener an die onmessage
, onerror
oder anhängen onclose
. ABER ich rate dir davon ab. Ich bin mir nicht sicher, was Ihr Anwendungsfall dafür ist, aber die WebsocketProvider-Klasse verarbeitet das Abonnement dieser Ereignishandler ziemlich gut. Wenn Sie ein Zuverlässigkeitsproblem mit dem Websocket-Anbieter haben, mit dem Sie verbunden sind, möchten Sie möglicherweise die Verbindung zu einem anderen ändern.
3. Wo ist der Quellcode dafür, da er nirgendwo in github.com/ethereum/web3.js zu finden ist
Der Code befindet sich tatsächlich in dem Repository, auf das Sie verwiesen haben. Vielleicht möchten Sie zur 1.0
Verzweigung wechseln, um den richtigen Code für anzuzeigen web3@1.0.0
.
Wo ist der Quellcode dafür, da er nirgendwo in github.com/ethereum/web3.js zu finden ist
https://github.com/HaoLLL/web3-eth-contract/blob/master/src/index.js