2015-03-13 2 views
3

Я использую метод метеоризмы для извлечения значений из функции на стороне клиента. Я использую stripe api, он работает нормальноКак передавать сообщения об ошибках от сервера метеоров к клиенту

Однако при возникновении ошибки в функции stripe.charges.create ошибка не возвращается клиенту, что приводит к методу stripeCheckout, который отправляет пользователя в полный шаблон. Я предполагаю, что есть способ принять ошибки в ответе от ленточных серверов или функции Stripe.customers.create на стороне сервера передать их клиенту и сообщить пользователю о конкретной ошибке, а также не отправлять их в полный шаблон, используя оператор if, основанный на ошибках или Статус успеха с сервера полосы, который передается метеору.

Это то, что связано с ответом об ошибке из полос 'Stripe.charges.create function to the meteor server and then passing it back to the client through the stripeCheckout`.

Хорошо, надеюсь, я смогу решить эту проблему. И любые советы по подходу к созданию этого токена, созданию клиента и взиманию платы за лучшую практику, я открыт для любых предложений.

Спасибо!

Клиент JS

Stripe.card.createToken({ 
    number: $('.card-number').val(), 
    cvc: $('.card-cvc').val(), 
    exp_month: $('.card-expiry-month').val(), 
    exp_year: $('.card-expiry-year').val(), 
    address_line1: addressValue1, 
    address_line2 : addressValue2, 
    address_city: cityValue, 
    address_state: provinceState, 
    address_country: country, 
    address_zip: zip, 
    name: firstName + lastName 
}, stripeResponseHandler); 

function stripeResponseHandler(status, response) { 
    if (response.error) { 

    alert(response.error.message); 
    }else{ 

    // response contains id and card, which contains additional card details 
    var token = response.id; 

    Meteor.call('stripeCheckout',token, function (error, result) { 
    Router.go("/complete"); 
    }); 

    } 
} 

Сервер JS

Meteor.methods({ 

    stripeCheckout: function (token) { 

    Stripe.customers.create({ 
     source: token 
    }, function(err, customer) { 
     id = customer.id; 

     if(err){ 
     throw new Meteor.Error("create-failed", err.message); 
     }else{ 
     throw new Meteor.Error("create-failed", err.message); 
     } 

     Stripe.charges.create({ 
      amount: 1000, 
      currency: 'usd', 
      customer: id 
     }, function (err, res) { 

     if(err){ 
     throw new Meteor.Error("create-failed", err.message); 
     }else{ 
     throw new Meteor.Error("create-failed", err.message); 
     } 

     }); 

    }); 
    } 
}); 

UPDATE:

Я добавил свои текущие выявляющие ошибки, я бросаю ошибку во всех случаях, и я получаю это ответ в моей консоли.

Exception in delivering result of invoking 'stripeCheckout': TypeError: Cannot read property 'error' of undefined 
    at http://localhost:3000/client/stripeClient.js?0eb126fd5e018d3cac3f8ec1505f32b7fdc97604:197:22 
    at Meteor.bindEnvironment [as _callback] (http://localhost:3000/packages/meteor.js?81e2f06cff198adaa81b3bc09fc4f3728b7370ec:977:22) 
    at _.extend._maybeInvokeCallback (http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:3858:12) 
    at _.extend.receiveResult (http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:3878:10) 
    at _.extend._livedata_result (http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:4931:9) 
    at onMessage (http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:3723:12) 
    at http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:2717:11 
    at Array.forEach (native) 
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:156:11) 
    at _.extend._launchConnection.self.socket.onmessage (http://localhost:3000/packages/ddp.js?41b62dcceb3ce0de6ca79c6aed088cccde6a44d8:2716:11) 

Это нашивки POST /v1/customers ответ

{ 
error:{ 
    message: "Your card was declined." 
    type: "card_error" 
    code: "card_declined" 
} 
} 
+0

Вы нашли способ решить эту проблему? Я в той же ситуации ... – JohnnyQ

ответ

3

Просто бросить Meteor.Error так:

Meteor.methods({ 
    stripeCheckout: function (token) { 
    Stripe.customers.create({ 
     source: token 
    }, function(err, customer) { 
     id = customer.id; 

     Stripe.charges.create({ 
      amount: 1000, 
      currency: 'usd', 
      customer: id 
     }, function (err, res) { 

     // first argument is error code, second is error details 
     throw new Meteor.Error("create-failed", err.message); 

     }); 
    }); 
    } 
}); 

Вы получите сообщение об ошибке вы бросили в error аргумент метода обратного вызова.

Смотрите документы здесь: http://docs.meteor.com/#/full/meteor_error

+2

Когда я 'console.log (ошибка);' на стороне клиента функция meteor.call, я получаю неопределенное значение. хмм. –

+0

Совместим ли ваш код на стороне сервера со вторым обратным вызовом? Возможно, вы также должны сделать ошибку, если создание клиента не удастся. – stubailo

+0

Я выдал ошибки в обеих функциях только с неопределенным возвратом. Я обновил свой код выше. –

Смежные вопросы