Erro 'O código do meteoro deve sempre ser executado dentro de uma fibra' ao usar o pacote NPM
-
21-12-2019 - |
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?
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.