使用 NPM 包时出现"流星代码必须始终在光纤内运行"错误



我正在使用Meteor.require('npmPackage')来使用NPM包。然而,在npm包的回调函数中向mongo写入时,我似乎遇到了一个错误。

错误:

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
});

如果需要(如果需要),可以将params添加到npmPackage.getInfoSync()中。

问题是回调需要在光纤中,这就是错误的来源。最好的方法是使用Meteor.bindEnvironmentMeteor._wrapAsync为您执行此操作并使代码同步。哪个更好:)

流星_wrapAsync是一个未记录的方法,它接收一个方法,该方法的最后一个参数是回调,第一个参数为error,第二个为result。就像你的回拨一样。

然后,它将回调封装到Meteor.bindEnvironment中,等待它,然后同步返回值。

最新更新