0

Meteor.callサーバーコードでエラーが内部で発生した場合、クライアントのエラーコールバックでエラーを取得できませんMeteor.bindEnvironment。以下は複製するサンプルコードです

サーバー内

Meteor.methods({
  customMethod: function(arg1, arg2){
      Stripe.customers.create({
        email: "email@here.com,
        description: "blah blah",
        source: token,
        metadata: {
          planId: planId,
          quantity: n
        },
        plan: planId,
        quantity: n
      }, Meteor.bindEnvironment(function (err, customer) {
        if(err){
          console.log("error", err);
          // TODO cannot catch this error on the client
          throw new Meteor.Error(err.rawType, err.message)
        }
      }))
    }
})

Meteor イベント内のクライアントでは、

Meteor.call('customMethod', arg1, arg2, function (err, resp) {
 if(err){
   Session.set('some-error', err)
 }
 if(resp){
   // TODO cannot catch errors throwing from the server
   // when inside Meteor.bindEnvironment 
   Session.set('some-success', true)
 }
});

セッション変数が設定されることはありません。どんな助けでも素晴らしいでしょう。ありがとう!

4

1 に答える 1

0

の 2 番目の引数Meteor.bindEnvironmentは、最初の引数として指定したコールバック内で例外がスローされるたびに呼び出されるエラー ハンドラーです。したがって、次のようにしてエラーをクライアントに返すことができます。

Meteor.bindEnvironment(function (err, customer) {
  if (err) throw err
  ...
}, function (err) {
  if (err) throw new Meteor.Error(err.message)
})

アップデート

すみません、それは少し性急でした。問題は、エラー (および潜在的な結果) が非同期コールバックから発生しているため、メソッド関数が実行を終了し、コールバックが何かを実行するまでに暗黙的に返さundefinedれる (としてクライアントに渡される) という事実です。null

歴史的には、これをfutureで解決していましたが、今ではより優れた promise があります。

Meteor.methods({
  customMethod (arg1, arg2) {
    return new Promise((resolve, reject) => {
      Stripe.customers.create({
        email: "email@here.com,
        ...
      }, Meteor.bindEnvironment(function (err, customer) {
        if(err){
          reject(err)
        }
        resolve(customer)
      })).catch(e => { throw new Meteor.Error(e) })
  }
})

Meteor メソッドは、Promise が解決または拒否され、DDP を介して結果 (またはエラー) を返すのを待つのに十分賢いです。エラーをキャッチして正式にスローする必要がありますが、メソッド呼び出しはそれを待つことになります。

于 2015-11-20T16:01:43.600 に答える