Meteor.call没有返回响应

时间:2013-11-09 13:38:10

标签: javascript meteor

我正在尝试让Stripe使用新的promises支持。

使用checkout,我获取令牌并将其发送到服务器:

Meteor.call('submit_charge', res.id, fee, name, reg, function (err, res) {
    console.log(err, res);
});

服务器方法定义为:

submit_charge: function(tok, amt, name, reg) {
    var Stripe = StripeAPI('privatekey');
    console.log('Submitting charge for ' + name);
    Stripe.charges.create({
        amount: amt,
        currency: "usd",
        card: tok,
        description: "Payment - " + name,
        metadata: {
            'reg': reg
        },
    }).then(function(charge) {
        console.log('Charge: ' + charge.id);
        return charge.id;
    }, function(err) {
        console.log('Error: ' + err);
        return 0;
    });
}

我可以调用该方法并执行,但不会返回任何内容。 console.log(err, res)中的Meteor.call为两者返回undefined。

收费流程......以及console.logs显示Stripe的收费ID,因此它似乎不是异步问题。

我错过了一些非常基本的东西吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您必须使用同步javascript:

submit_charge: function(tok, amt, name, reg) {
    var Stripe = StripeAPI('privatekey');
    console.log('Submitting charge for ' + name);

    var createCharge = Meteor._wrapAsync(Stripe.charges.create.bind(Stripe.charges));

    try {
        var result = createCharge({
            amount: amt,
            currency: "usd",
            card: tok,
            description: "Payment - " + name,
            metadata: {
            'reg': reg
        });

        return result;
    }
    catch(e) {
        //Error
        console.log(e);
    }
}

基本上你是在尝试从回调中返回数据。您需要{me}方法的return数据,而不是then中的函数。

使用Meteor._wrapAsync使用Fibers等待事务完成然后返回值或抛出错误(因此try / catch)以获取错误。