2017-04-13 112 views
0

我使用throw new Meteor.Error從服務器方法拋出錯誤。如何從服務器端拋出錯誤並從客戶端捕獲錯誤?

客戶端似乎沒有拿起它,並且回調的error參數始終爲undefined,但在終端中它出現錯誤並重新啓動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

只有

if(Meteor.isServer)

如何從服務器端拋出一個錯誤,並從客戶端捕獲它

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

將無法​​正常工作?

方法代碼:

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

我可以看到您的完整代碼嗎?你是如何發現錯誤 – 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"); 
} 

看看客戶端是現在能夠趕上同。

相關問題