Pergunta

estou a usar Meteor.require('npmPackage') para usar um pacote NPM.No entanto, parece que estou recebendo um erro ao escrever para o mongo na função de retorno de chamada do pacote npm.

Erro:

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

Código

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

Tentei agrupar o código no Fiber, mas a mesma mensagem de erro ainda é mostrada:

Fiber(function() {

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

}).run();

Pergunta: Como deveria Meteor.bindEnvironment ser usado para fazer isso funcionar?

Foi útil?

Solução

Tente usar wrapAsync por exemplo

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

var data = npmPackage.getInfoSync();

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

Você pode adicionar parâmetros em npmPackage.getInfoSync() se quiser (se for preciso).

O problema é que o retorno de chamada precisa estar em uma fibra de onde vem o erro.A melhor maneira de fazer isso é com Meteor.bindEnvironment. Meteor._wrapAsync faz isso para você e torna o código síncrono.O que é ainda melhor :)

Meteor._wrapAsync é um método não documentado que aceita um método cujo último parâmetro é um retorno de chamada com o primeiro parâmetro como error e o segundo como result.Assim como seu retorno de chamada.

Em seguida, ele envolve o retorno de chamada em um Meteor.bindEnvironment e espera por isso e retorna o valor de forma síncrona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top