当前位置: 首页 > 面试题库 >

Meteor:在服务器上正确使用Meteor.wrapAsync

翟奇
2023-03-14
问题内容

背景

我正在尝试将条纹付款集成到我的网站中。我需要使用我的专用条纹密钥创建一个条纹用户。我将此密钥存储在服务器上,并调用服务器方法来创建用户。也许还有另一种方法可以做到这一点?

//stripe api call
var Stripe = StripeAPI('my_secret_key');

Stripe.customers.create({
  description: 'Customer for test@example.com',
  card: "foobar" // obtained with Stripe.js
}, function(err, customer) {
  // asynchronously called
});

我的尝试和结果

我一直在使用相同的客户端代码和不同的服务器代码。所有尝试都会立即在客户端的console.log(…)上给出undefined,但在服务器的console.log(…)上给出正确的响应:

//client
Meteor.call('stripeCreateUser', options, function(err, result) {
  console.log(err, result);
});

//server attempt 1
var Stripe = StripeAPI('my_secret_key');

Meteor.methods({
    stripeCreateUser: function(options) {  
        return Meteor.wrapAsync(Stripe.customers.create({
            description: 'Woot! A new customer!',
            card: options.ccToken,
            plan: options.pricingPlan
        }, function (err, res) {
            console.log(res, err);
            return (res || err);
        }));
    }
});

//server attempt 2
var Stripe = StripeAPI('my_secret_key');

Meteor.methods({
    stripeCreateUser: function(options) {  
        return Meteor.wrapAsync(Stripe.customers.create({
            description: 'Woot! A new customer!',
            card: options.ccToken,
            plan: options.pricingPlan
        }));
    }
});

我也尝试了没有Meteor.wrapAsync的情况。


问题答案:

Meteor.wrapAsync您可以看到需要向其传递一个函数和一个可选的上下文,而在两次尝试中,您都传递了调用异步版本的结果Stripe.customers.create

Meteor.methods({
  stripeCreateUser: function(options) {
    // get a sync version of our API async func
    var stripeCustomersCreateSync=Meteor.wrapAsync(Stripe.customers.create,Stripe.customers);
    // call the sync version of our API func with the parameters from the method call
    var result=stripeCustomersCreateSync({
      description: 'Woot! A new customer!',
      card: options.ccToken,
      plan: options.pricingPlan
    });
    // do whatever you want with the result
    console.log(result);
  }
});

Meteor.wrapAsync将异步函数转换为方便的同步外观函数,该函数允许编写顺序查找的代码。(底层仍然在异步Node.js事件循环中执行所有操作)。

我们需要将函数上下文与函数上下文一起传递给Meteor.wrapAsync我们的API函数(Stripe.customers.create),即this在API函数的主体内部(在本例中为)Stripe.customers

编辑:

如何找回错误?

传统的节点样式API函数通常将回调作为最后一个参数,当所需的任务完成时,它将最终被调用。此回调采用2个参数:error和data,根据调用结果,其中任一个将为null。

我们如何使用返回的同步包装函数访问错误对象Meteor.wrapAsync

我们必须依靠使用try / catch块,因为如果发生错误,它将由sync函数抛出,而不是作为异步函数回调的第一个参数传递。

try{
  var result=syncFunction(params);
  console.log("result :",result);
}
catch(error){
  console.log("error",error);
}
// is the equivalent of :
asyncFunc(params,function(error,result){
  if(error){
    console.log("error",error);
    return;
  }
  console.log("result :",result);
});

为什么不需要通过Stripe?

JavaScript没有“命名空间”概念,因此API开发人员使用了一种通用技巧,即定义充当API名称空间的全局对象,在此对象上定义的属性是API的“子模块”。这意味着它Stripe.customers是Stripe
API的子模块,用于公开与客户相关的功能,因此这些功能this上下文Stripe.customers不是Stripe

您可以通过将以下模拟代码复制粘贴到浏览器控制台中来自己进行测试:

Stripe={
  customers:{
    create:function(){
      console.log(this==Stripe.customers);
    }
  }
};

然后像这样在浏览器控制台中调用存根函数:

> Stripe.customers.create();
true


 类似资料:
  • 我刚刚注册了一个godaddy服务器来测试我正在编写的PHP脚本。我使用PHPMailer发送电子邮件,它使用godaddy电子邮件主机:relay-hosting.secureserver.net 问题是我想将电子邮件标记为来自“me”@gmail.com 当我使用AddReplyTo字段中的gmail地址发送电子邮件时,收件人电子邮件帐户会直接将其发送到垃圾邮件文件夹。 我知道这里有一个基本的

  • 问题内容: 我正在尝试使游戏服务器在一段时间后更新。 当我这样做时,python在其中一个内核上消耗了100%的计算能力。我真的不明白为什么会这样,如果可能的话如何解决。 问题答案: 在每次轮询之间插入一个10毫秒的毫秒,否则您的循环将持续轮询时间,而不会释放CPU的电源。 编辑:更好,仅在需要时等待一次。如果发生严重的CPU过载,则等待时间可能为负,在这种情况下,可以立即触发2个操作。并不断地重

  • 我不确定是否正确集成? 可以从获取数据源吗? Hiberante配置与是否正确? 由于它嵌入在JVM中,不由容器管理,JTATransactionManager能够识别ActimeMQ吗?

  • 我在架构“ID”中的链接服务器(宿主服务器)上有一个名为“Application”的表。我正在尝试使用< code>sp_help查看相同的详细信息。 但我做不到。问题是:1.sp_help位于schema中。(很明显!)2.但我的表位于另一个名为的模式中。(例如,从ID.Application中选择*) > 我已经将链接服务器添加到我的本地sql server management studio

  • 我得到这个错误,因为两天前,当我更新我的Android Studio到最新的稳定版本2.3;完整的错误消息,我从Gradle控制台是: 我试图解决这个问题: > 卸载并删除所有Android Studio的东西(除了项目目录),重新启动MAC,安装新鲜和最新的Android Studio。 增加gradle vm ram在项目 已卸载防病毒软件并重新启动mac 环境: 操作系统:MacOS Sie

  • 我已经在亚马逊 EC2 实例上安装了 Redis 服务器。Redis在服务器上工作正常 现在我想打开端口6379在安全组中“编辑入站规则”你能告诉我我应该使用的类型和协议吗?提前致谢