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

Я использую 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, чтобы заставить это работать?

Ответ 1

Попробуйте использовать wrapAsync e.g

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

var data = npmPackage.getInfoSync();

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

Вы можете добавить params в npmPackage.getInfoSync(), если хотите (если это потребуется).

Дело в том, что обратный вызов должен быть в волокне, из которого возникает ошибка. Лучший способ сделать это - Meteor.bindEnvironment. Meteor._wrapAsync делает это для вас и делает код синхронным. Что еще лучше:)

Meteor._wrapAsync - это недокументированный метод, который принимает метод, последний параметр которого является обратным вызовом с первым параметром как error, а второй - как result. Также как ваш обратный вызов.

Затем он завершает обратный вызов в Meteor.bindEnvironment и ждет его, а затем возвращает значение синхронно.