2016-08-01 10 views
0

基本的に、クライアントはMeteor.callを使用してサーバーを呼び出します。サーバーメソッドはいくつかのバリデーションを行い、流星パッケージを使ってWebサービスを呼び出します。検証が失敗し、流星のエラーがスローされると、サーバーに到達します。パッケージの応答にエラーがある場合は、サーバーにのみ記録されます。クライアントに連絡するにはエラーが必要です。Throwing Meteor.Errorがクライアントに届かない

コードの外観は次のとおりです。サーバーの方法で

クライアント

Meteor.call('callService', (err, result) => { 
    if(err) { 
     console.log(err.reason); 
    } 
}); 

サーバー

Meteor.methods({ 
    'callService'(){ 
     if (!Meteor.user()) { 
      // Error 1 
      throw new Meteor.Error('insufficient-permissions', 'You need to login first'); 
     } 
     // Using an meteor package to actually call the service 
     package.callService(apiKey, (err, response) => { 
      if (response.status === 'error') { 
       // Error 2 
        throw new Meteor.Error('service-error', response.message); 
      } 
     }); 
    }, 
}); 

エラーがエラー1でスローされた場合、それはクライアントに到達しますが、エラー2はありません。 エラー2はサーバーにのみログオンします。

答えて

1

package.callService()は非同期です(コールバックを受け入れると仮定します)。

この場合、非同期タスクが実行中(実際にリモートWebサービスからの応答を待っている間)、Meteorメソッドは非同期タスクを開始し、処理を続行し、 。したがって、クライアントのMeteorコールのコールバックは「エラーなし」の応答を受け取ります。

「エラー2」が発生すると、Meteorコールはすでに完了しており、エラーはサーバーにしか記録できません。

package.callService()の結果が成功かエラーかを判断し、それに応じてメテオコールを完了するまで待つようにメソッドを「ハングアップ」する場合は、Meteor.wrapAsync()を試してみてください。

ところで、同期サービスを使用して実際にリモートサービスを待機させる場合、this.unblock()に興味があり、サーバーはアイドル状態ではなく他のタスク(メソッド)を処理できます。

+0

これは全く同じです。申し訳ありませんが、私はこれを受け入れられたと完全に忘れていました – nupac

関連する問題