Ошибка "Код Meteor всегда должен выполняться в пределах оптоволокна" при использовании пакета NPM

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

Вопрос

Я использую 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 и ожидает его, после чего возвращает значение синхронно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top