2016-04-18 3 views
1

Hinweis: Es gibt viele Fragen zu diesem Thema, aber ich bin nicht in der Lage, meinen Code (aufgrund von Syntaxproblemen usw.) in das richtige Format zu bekommen. Das ist also eine Frage zu meiner spezifischen Instanz.Wie Meteor Einsatz in einer Faser ausführen

Ich habe etwas Code in init.js unter dem Ordner "lib", um ein Ereignis aus dem Paket web3/ethereum zu nehmen und es in einer Sammlung zu speichern. Beachten Sie, dass die Frage nur eine Meteorfrage ist. Ich habe die kontextuellen Informationen über web3/ethereum aufgenommen, weil es wahrscheinlich ein ähnliches Problem ist, das von anderen Personen beim Speichern von web3/ethereum-Ereignissen in einer Meteor-Sammlung angetroffen wird.

var events = contract_instance.allEvents([]); 

events.watch(function(error, event){ 
    if (!error) 
    console.log(event.args); 

var event_object_value1 = event.args.value1; 
//everything up to this point works fine. event_object is in a json format. 

//inserting the value into a collection on the server side like this is what causes the error. 
collection.insert({"key": value1}); 
}); 

Die letzte Zeile erzeugt den Meteor code must always run within a Fiber. Fehler. Normalerweise würde ich mit einer Meteor-Methode einfügen, aber ich vermute, dass ich den gleichen Fehler bekommen würde, wenn ich die Insert tatsächlich mache.

Es gibt einige Fragen zu diesem Fehler auf Stackoverflow, aber ich bin nicht wirklich in der Lage, meinen Code innerhalb einer Faser richtig zu bekommen. Ich habe versucht, hier diesem Beispiel zu folgen, aber ich denke, es ist einfach viel zu über meinem Verständnis von Meteor: https://meteorhacks.com/fibers-eventloop-and-meteor/

Antwort

2

Ersetzen Sie einfach

events.watch(function(error, event) { 
    ... 
}); 

mit

events.watch(Meteor.bindEnvironment(function(error, event) { 
    ... 
})); 

Meteor.bindEnvironment sorgt dafür, dass die Wrapped-Funktion läuft innerhalb einer Faser.