„Meteor-Code muss immer innerhalb einer Glasfaser ausgeführt werden“-Fehler bei Verwendung des NPM-Pakets

StackOverflow https://stackoverflow.com//questions/20041177

Frage

Ich benutze Meteor.require('npmPackage') um ein NPM-Paket zu verwenden.Beim Schreiben in Mongo in der Rückruffunktion des npm-Pakets wird jedoch anscheinend eine Fehlermeldung angezeigt.

Fehler:

Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

Code

npmPackage.getInfo(function(err, data) {
    UserSession.insert({
        key: 'info',
        value: data
    });
    console.log(data);
});

Ich habe versucht, den Code in Fiber zu verpacken, aber es wird immer noch die gleiche Fehlermeldung angezeigt:

Fiber(function() {

    npmPackage.getInfo(function(err, data) {
        UserSession.insert({
            key: 'info',
            value: data
        });
        console.log(data);
    });

}).run();

Frage: Wie sollte Meteor.bindEnvironment verwendet werden, damit dies funktioniert?

War es hilfreich?

Lösung

Versuchen Sie es mit wrapAsync z.B

npmPackage.getInfoSync = Meteor._wrapAsync(npmPackage.getInfo.bind(npmPackage));

var data = npmPackage.getInfoSync();

UserSession.insert({
    key: 'info',
    value: data
});

Sie können Parameter hinzufügen npmPackage.getInfoSync() wenn du willst (falls es welche braucht).

Die Sache ist, dass der Rückruf in einer Faser erfolgen muss, aus der der Fehler stammt.Am besten geht das mit Meteor.bindEnvironment. Meteor._wrapAsync erledigt dies für Sie und macht den Code synchron.Was sogar noch besser ist :)

Meteor._wrapAsync ist eine undokumentierte Methode, die eine Methode aufnimmt, deren letzter Parameter ein Rückruf mit dem ersten Parameter ist error und der zweite als result.Genau wie Ihr Rückruf.

Anschließend wird der Rückruf in eine verpackt Meteor.bindEnvironment und wartet darauf und gibt dann synchron den Wert zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top