Erreur « Le code Meteor doit toujours s'exécuter dans une fibre » lors de l'utilisation du package NPM

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

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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top