2017-04-13 1 views
0

throw new Meteor.Error을 사용하는 서버 방법에서 오류가 발생했습니다.서버 측에서 오류를 throw하고 클라이언트 측에서 캐치하는 방법은 무엇입니까?

클라이언트가 응답을받지 못하고 콜백의 error 인수는 항상 undefined이지만 터미널에서는 throws 오류가 발생하고 유성이 다시 시작됩니다.

 
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

전체 코드를 볼 수 있습니까? 어떻게 당신이 오류 thouding입니까 – 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"); 
} 

보기 .

관련 문제