我试图让Braintree Payments在Meteor应用中运行。我试图将生成令牌(服务器端,通过流星方法)的结果返回到客户端。
我试过这个:
/server/braintree.js
Meteor.methods({
createClientToken: function() {
var token = gateway.clientToken.generate({
customerId: this.userId
}, function(err, response) {
clientToken = response.clientToken
return clientToken
}
)
console.log(token)
return token
}
})
返回true
。
我也试过这个:
Meteor.methods({
createClientToken: function() {
var clientToken
gateway.clientToken.generate({
customerId: this.userId
}, function(err, response) {
clientToken = response.clientToken
}
)
console.log(clientToken)
return clientToken
}
})
返回undefined
。
function(err, response)
是异步调用的,是吗?如果是这样,那就是问题的解释。似乎尝试从异步函数返回值是Javascript中的一个痛点。我已经在其上阅读了许多SO答案(例如this one,this one和this one),但似乎没有一个能让我朝着正确的方向前进。
另外,我相信我可能需要使用Meteor的wrapAsync
方法,对吗?我已经尝试了这个(并在其上发现了this和this相关的SO问题),但似乎仍然无法做到正确。
感谢任何反馈。
更新
有关将Braintree与Meteor集成的工作方法,请查看example repo(非常感谢@Nick Tomlin)
答案 0 :(得分:6)
免责声明:我为Braintree工作:)
我不熟悉Meteor,但正如@mrak所说,clientToken.generate
是异步的,你肯定会在你的方法中适当地处理它。
在您当前的代码中,clientToken
未定义,因为console.log(clientToken)
会立即执行,然后才能从clientToken
的回调中收到clientToken.generate
。如果您习惯于在同步问题中进行编码,异步编程可能需要一段时间才能完成,但是有很多资源可以帮助您(这里是one)。
似乎Meteor.wrapAsync
确实会提供您所需要的内容,这是未经测试的示例实现。
Meteor.methods({
createClientToken: function() {
var createToken = Meteor.wrapAsync(gateway.clientToken.generate, gateway.clientToken);
var response = createToken({});
return response.clientToken;
}
});
<强>更新强>
我已经创建了一个非常基本的Braintree + Meteor application,可能对您有用(如果不是,请在GH回购中提出问题以帮助改进它!)