Erreur « Le code Meteor doit toujours s'exécuter dans une fibre » lors de l'utilisation du package NPM
-
21-12-2019 - |
Question
j'utilise Meteor.require('npmPackage')
pour utiliser un package NPM.Cependant, il semble que j'obtienne une erreur lors de l'écriture sur mongo dans la fonction de rappel du package npm.
Erreur:
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);
});
J'ai essayé d'encapsuler le code dans Fiber mais le même message d'erreur s'affiche toujours :
Fiber(function() {
npmPackage.getInfo(function(err, data) {
UserSession.insert({
key: 'info',
value: data
});
console.log(data);
});
}).run();
Question: Comment doit Meteor.bindEnvironment
être utilisé pour que cela fonctionne ?
La solution
Essayez d'utiliser wrapAsync
par exemple
npmPackage.getInfoSync = Meteor._wrapAsync(npmPackage.getInfo.bind(npmPackage));
var data = npmPackage.getInfoSync();
UserSession.insert({
key: 'info',
value: data
});
Vous pouvez ajouter des paramètres dans npmPackage.getInfoSync()
si tu veux (s'il en faut).
Le fait est que le rappel doit être dans une fibre, d'où vient l'erreur.La meilleure façon de le faire est avec Meteor.bindEnvironment
. Meteor._wrapAsync
fait cela pour vous et rend le code synchrone.Ce qui est encore mieux :)
Meteor._wrapAsync est une méthode non documentée qui intègre une méthode dont le dernier paramètre est un rappel avec le premier paramètre comme error
et le second comme result
.Tout comme votre rappel.
Il enveloppe ensuite le rappel dans un Meteor.bindEnvironment
et l'attend puis renvoie la valeur de manière synchrone.