2017-04-13 16 views
0

throw new Meteor.Errorを使用してサーバーメソッドからエラーをスローしています。サーバー側からエラーをスローしてクライアント側からキャッチする方法はありますか?

クライアントはそれを受け取っておらず、コールバックのerror引数は常にundefinedですが、端末にはthrowsというエラーが表示され、Meteorが再起動します。

 
W20170413-17:27:28.900(1)? (STDERR) /home/xeconcepts/.meteor/packages/meteor-tool/.1.4.2-1-beta.1.si3hb0++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:280 
W20170413-17:27:28.900(1)? (STDERR)       throw(ex); 
W20170413-17:27:28.900(1)? (STDERR)      ^
W20170413-17:27:29.175(1)? (STDERR) Error: carte existe [204] 
W20170413-17:27:29.175(1)? (STDERR)  at imports/api/users/methods.js:211:47 

とストライプmethodsまたは

const Stripe = require('stripe'); 
const stripe = Stripe("sk_test_pO*******MUDXjlF8v"); 

、サーバー側からのエラーをスローし、クライアント側からそれをキャッチする方法

if(Meteor.isServer)

でのみ動作しないのだろうか?

メソッドのコード:

export const addCCStudent = new ValidatedMethod({ 
    name: 'addCCStudent', 
    validate: new SimpleSchema({ 
     id: { 
      type: String 
     }, 
     number: { 
      type: String 
     }, 
     dateMM: { 
      type: String 
     }, 
     dateYYYY: { 
      type: String 
     }, 
     cvc: { 
      type: String 
     } 
    }).validator(), 
    run(p) { 
     try { 
      if (Meteor.isServer) { 
       const Fiber = require('fibers'); 
       const Stripe = require('stripe'); 
       const stripe = Stripe("*************"); 


       stripe.tokens.create({ 
        card: { 
         "number": p.number, 
         "exp_month": p.dateMM, 
         "exp_year": p.dateYYYY, 
         "cvc": p.cvc 
        } 
       }, function(err, token) { 
        console.log("tokenserr", err); 
        console.log("token", token); 
        if (!err) { 
         Fiber(function() { 
          // console.log("p", p) 
          var user = Meteor.users.findOne({ 
           _id: p.id 
          }); 
          //console.log("addCCStudentuser", user); 
          if (user) { 
           var cCArray = user.profile.UserCards; 
           if (cCArray) { 
            var exist = false; 
            for (var i = 0; i < cCArray.length; i++) { 
             if ((cCArray[i].number == p.number) && (cCArray[i].dateMM == p.dateMM) && (cCArray[i].dateYYYY == p.dateYYYY)) { 
              exist = true 
             } 
            } 

            if (exist) { 
             throw new Meteor.Error(204, "carte existe"); 
            } else { 

             Meteor.users.update({ 
              _id: p.id, 
             }, { 
              $push: { 
               'profile.UserCards': { number: p.number, dateMM: p.dateMM, dateYYYY: p.dateYYYY } 
              } 
             }); 
            } 
           } 
          } 
         }).run(); 
        } else { 
         // console.log("errerrerrerr", err.raw.message); 
         throw new Meteor.Error(204, err.raw.message); 
        } 

       }); 
      } 

     } catch (error) { 
      console.log("error", error) 
      throw new Meteor.Error(203, error.reason); 
     } 

    }, 
}); 
+1

あなたのフルコードは表示できますか?どのようにエラーをthowingている – Ethaan

+0

あなたのコードを投稿しない場合は助けてください – Sean

+0

https://pastebin.com/G0m1kDAq –

答えて

0

理想的に流星は、メソッド内で直接投げられたすべてのエラーをキャッチする必要がありますが、あなたのケースでは、これはあなたのエラーのほとんどはFiber関数呼び出し内にラップされているという事実によって悪化することができます。

サーバー側でエラーが発生している可能性がありますが、メソッドの呼び出し元(クライアント側で、ValidatedMethodからの応答を期待している)にはバブルが発生しません。

Fiber機能の結果を返すようにしてください。 fibersパッケージのドキュメントの例を見ると、try-catchブロックはFibers関数呼び出しの周りにある必要があり、ValidatedMethodの内容全体ではありません。

また、すべてのエラーステートメントの前にreturnを追加することもできます。例えば

return throw new Meteor.Error(204, "carte existe")

注:あなたは、このエラーにアクセスしようとしているクライアント側のコードを共有している場合それはまた良いでしょう。

0

これを試してください。あなたがエラーをスロー繊維内部 、繊維外エラー

if (exist) { 
     ErrorFunction() 
    } 

をスロー機能により、クライアントが今同じをキャッチすることができる場合

ErrorFunction() { 
     throw new Meteor.Error(204, "carte existe"); 
} 

が参照機能を置くことを置き換えます。

関連する問題