'Codice Meteor deve sempre funzionare all'interno di un errore in fibra quando si utilizza il pacchetto NPM
-
21-12-2019 - |
Domanda
Sto usando Meteor.require('npmPackage')
per utilizzare un pacchetto NPM.Comunque mi sembra di ottenere un errore quando scrivo al mongo nella funzione di callback del pacchetto di NPM.
Errore:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
Codice
npmPackage.getInfo(function(err, data) {
UserSession.insert({
key: 'info',
value: data
});
console.log(data);
});
.
Ho provato a avvolgere il codice all'interno della fibra ma lo stesso messaggio di errore è ancora visualizzato:
Fiber(function() {
npmPackage.getInfo(function(err, data) {
UserSession.insert({
key: 'info',
value: data
});
console.log(data);
});
}).run();
.
Domanda: Come dovrebbe essere utilizzato Meteor.bindEnvironment
per far funzionare questo?
Soluzione
Prova a utilizzare wrapAsync
E.G
npmPackage.getInfoSync = Meteor._wrapAsync(npmPackage.getInfo.bind(npmPackage));
var data = npmPackage.getInfoSync();
UserSession.insert({
key: 'info',
value: data
});
.
È possibile aggiungere parametri in npmPackage.getInfoSync()
se vuoi (se ci vuole).
La cosa è che il callback deve essere in fibra che è da dove viene l'errore.Il modo migliore per farlo è con Meteor.bindEnvironment
.Meteor._wrapAsync
fa questo per te e rende il codice sincrono.Che è ancora meglio :)
meteor._wrapasync è un metodo non documentato che assume un metodo che è l'ultima param è un callback con il primo parametro come error
e il secondo come result
.Proprio come il tuo callback.
Si avvolge quindi la richiamata in un Meteor.bindEnvironment
e attende che quindi restituisca il valore in modo sincrono.