Ошибка "Код Meteor всегда должен выполняться в пределах оптоволокна" при использовании пакета NPM
-
21-12-2019 - |
Вопрос
Я использую Meteor.require('npmPackage')
чтобы использовать пакет NPM.Однако, похоже, я получаю ошибку при записи в mongo в функции обратного вызова пакета npm.
Ошибка:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
Код
npmPackage.getInfo(function(err, data) {
UserSession.insert({
key: 'info',
value: data
});
console.log(data);
});
Я попытался обернуть код внутри Fiber, но по-прежнему отображается то же сообщение об ошибке:
Fiber(function() {
npmPackage.getInfo(function(err, data) {
UserSession.insert({
key: 'info',
value: data
});
console.log(data);
});
}).run();
Вопрос: Как следует Meteor.bindEnvironment
быть использованным, чтобы заставить это сработать?
Решение
Попробуйте использовать wrapAsync
например,
npmPackage.getInfoSync = Meteor._wrapAsync(npmPackage.getInfo.bind(npmPackage));
var data = npmPackage.getInfoSync();
UserSession.insert({
key: 'info',
value: data
});
Вы можете добавить параметры в npmPackage.getInfoSync()
если вы хотите (если это потребуется).
Дело в том, что обратный вызов должен выполняться по оптоволокну, из которого исходит ошибка.Лучший способ сделать это - с помощью Meteor.bindEnvironment
. Meteor._wrapAsync
делает это за вас и делает код синхронным.Что еще лучше :)
Meteor._wrapAsync - это недокументированный метод, который принимает метод, последний параметр которого является обратным вызовом с первым параметром как error
а второй в качестве result
.Так же, как и ваш обратный звонок.
Затем он преобразует обратный вызов в Meteor.bindEnvironment
и ожидает его, после чего возвращает значение синхронно.