如何将错误消息从流星服务器传递到客户端

时间:2015-03-13 02:41:43

标签: javascript meteor error-handling stripe-payments

我正在使用meteor方法从客户端函数中检索值。我正在使用条带api,它工作正常

但是,如果stripe.charges.create函数中存在错误,则错误不会传递回客户端,从而导致stripeCheckout方法将用户发送到完整模板。我假设有一种方法可以从条带服务器获取Stripe.charges.create err.type响应中的错误,或者服务器端的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);
       }

      });

    });
  }
});

更新:

我添加了当前的错误检测,我在所有实例中抛出错误,并在控制台中收到此响应。

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)

这是Stripe POST /v1/customers响应

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

1 个答案:

答案 0 :(得分: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