这是纲要:
以下是我的方法在服务器上的样子:
createCustomer: function(token, email, plan){
try{
let createCustomer = Meteor.wrapAsync(stripe.customers.create);
let result = createCustomer({
source: token,
email: email,
plan: plan
});
let subscription = {
customer: result.id,
sub: result.subscriptions.data[0].id,
plan: result.subscriptions.data[0].plan.name
};
Meteor.users.update({_id: Meteor.userId()}, {$set: subscription});
} catch(error){
if(error.code === "incorrect_cvc"){
throw new Meteor.Error("incorrect_cvc", error.message);
}
// More of such errors follows
}
}
以下是客户端的样子:
Stripe.card.createToken({
number: number,
cvc: cvc,
exp_month: exp,
exp_year: exp_year,
address_zip: zip,
address_country: country
}, function(status, response){
if(response.error){
console.log("Make sure all fields are filled before submitting order.");
} else{
let token = response.id;
Meteor.call("createCustomer", token, email, plan, function(error, result){
if(result){
console.log("Congratulations, everything worked!");
} else{
if(error.error === "incorrect_cvc"){
console.log("oops, the CSV is incorrect");
}
// More of such errors follow..
}
})
}
});
因此,一切都在有真正错误的时候起作用,它在服务器+客户端上都很好。当用户使用卡时,将创建费用并始终创建订阅。 HOWEVER ,当成功并且所有内容都点击正常时,我仍然会通过回调在客户端收到错误,结果永远不会true
或触发。不知道为什么。
答案 0 :(得分:1)
Meteor上没有100%,但我认为你的createCustomer
方法实际上并没有返回任何内容,因此result
中的(err, result)
可能永远不会有任何内容?
正如评论中所提到的,您可能希望将这些步骤分开并将每个步骤包装在自己的try-catch
集中,以便更好地隔离问题。
另外,我觉得您可能会将服务器端错误代码概括为:
throw new Meteor.Error(error.error, error.message);
我甚至可能会尝试这样做,至少在测试/开发期间 - 这样你实际上可以console.log()
浏览器中的原始错误:
throw new Meteor.Error(error.error, error.message, JSON.stringify(error));