Meteor Braintree -- 通过Meteor方法创建客户端令牌

4

我想让你帮忙翻译一篇关于IT技术的文章。这篇文章涉及与Meteor应用程序中使用Braintree支付有关的内容。我的问题是,无法将通过Meteor Method(在服务器端)生成的令牌结果返回给客户端。

我已经尝试了以下方法:

/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答案(比如这个这个这个),但没有一个看起来能指导我正确方向。

此外,我认为我可能需要使用Meteor的wrapAsync方法,对吗?我已经尝试过这个方法(并找到了一些相关的SO问题,比如这个这个),但仍然无法得到正确的结果。

非常感谢任何反馈。

更新:

关于如何将Braintree与Meteor集成的可行方法,请查看示例存储库(非常感谢@Nick Tomlin提供此方法)。


1
我可以确认gateway.clientToken.generate的回调函数function(err, response)是异步调用的。但是,我无法保证Meteor特定的解决方法是否可行。 :( - mrak
1个回答

6

声明:我为 Braintree 工作 :)

我不熟悉 Meteor,但是正如 @mrak 指出的那样,clientToken.generate 是异步的,你需要在你的方法中正确处理它。

在你当前的代码中,clientToken 是未定义的,因为 console.log(clientToken) 立即执行,而在回调函数中接收到 clientToken 之前。如果你习惯同步编程,异步编程可能需要一段时间来理解,但有许多资源可以帮助你(这里是 一个)。

看起来,Meteor.wrapAsync 确实会提供你所需的内容,这里是一个未经测试的示例实现。

Meteor.methods({
  createClientToken: function() {
    var createToken = Meteor.wrapAsync(gateway.clientToken.generate, gateway.clientToken);

    var response = createToken({});

    return response.clientToken;
  }
});

更新

我创建了一个非常基本的Braintree + Meteor应用程序,可能对您有所帮助(如果不是,请在GH存储库上提交问题以帮助改进!)


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Isaac Gregson
如果我在generateToken函数中删除创建customerId的部分,那么它将创建token(不再是undefined),但仍然只是简单地返回“true”作为响应变量,而不是clientToken。 - Isaac Gregson
@IsaacGregson 做得很好,感谢您指出wrapAsync(我又更新了我的答案)。似乎应该有一种简单的方法可以在回调函数中更新客户端模板;今天我将尝试运行一个Meteor示例应用程序,因为我还不太熟悉它,无法提供更加专业的答案(显然^^)。如果您需要更专业的帮助,请随时联系我们的支持团队 - Nick Tomlin
太好了!我期待着看到即将推出的流星示例应用程序。感谢您在这里的贡献。 - Isaac Gregson
你好,Nick。你能否扩展一下你的示例,包括通过Drop-In进行订阅的部分?我在网上找不到其他有用的示例。 - Cos
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接