2017-04-13 115 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"); 
} 

看看客户端是现在能够赶上同。

相关问题