„Meteor-Code muss immer innerhalb einer Glasfaser ausgeführt werden“-Fehler bei Verwendung des NPM-Pakets
-
21-12-2019 - |
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?
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.