NPM パッケージ使用時の「Meteor コードは常にファイバー内で実行する必要があります」エラー
-
21-12-2019 - |
質問
使っています 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
それを待ってから値を同期的に返します。