NPM パッケージ使用時の「Meteor コードは常にファイバー内で実行する必要があります」エラー

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

質問

使っています 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
});

パラメータを追加できます npmPackage.getInfoSync() 必要に応じて(必要な場合)。

問題は、コールバックがファイバー内にある必要があり、そこからエラーが発生します。それを行うための最良の方法は、 Meteor.bindEnvironment. Meteor._wrapAsync これを自動的に実行し、コードを同期させます。どちらの方がさらに良いです:)

Meteor._wrapAsync は、最後のパラメータが最初のパラメータを持つコールバックであるメソッドを取り込む文書化されていないメソッドです。 error そして2番目は result. 。あなたのコールバックと同じです。

次に、コールバックを Meteor.bindEnvironment それを待ってから値を同期的に返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top