使用NPM软件包时,'Meteor代码必须始终在Fiber'错误中运行

Nyx*_*nyx 3 node.js npm meteor node-fibers meteorite

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

我尝试在Fiber中包装代码,但仍显示相同的错误消息:

Fiber(function() {

    npmPackage.getInfo(function(err, data) {
        UserSession.insert({
            key: 'info',
            value: data
        });
        console.log(data);
    });

}).run();
Run Code Online (Sandbox Code Playgroud)

问题:如何Meteor.bindEnvironment使用它来实现这个目的?

Aks*_*hat 5

尝试使用wrapAsync例如

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

var data = npmPackage.getInfoSync();

UserSession.insert({
    key: 'info',
    value: data
});
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加参数npmPackage.getInfoSync()(如果需要).

问题是回调需要在光纤中,而错误来自于光纤.最好的方法是使用Meteor.bindEnvironment.Meteor._wrapAsync为你做这件事并使代码同步.哪个更好:)

Meteor._wrapAsync是一个未记录的方法,它接受一个方法,其最后一个参数是第一个参数的回调,第二个参数errorresult.就像你的回调一样.

然后它将回调包装成a Meteor.bindEnvironment并等待它然后同步返回值.