gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:00:15 25 4
gpt4 key购买 nike

背景

我正在尝试将 Stripe 支付集成到我的网站中。我需要使用我的私有(private) strip key 创建一个 strip 用户。我将此 key 存储在我的服务器上,并调用服务器方法来创建用户。也许还有另一种方法可以做到这一点?这是 Stripe api(为方便起见复制在下面): https://stripe.com/docs/api/node#create_customer

//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 的情况。

编辑 - 我也在使用这个包: https://atmospherejs.com/mrgalaxy/stripe

最佳答案

来自 Meteor.wrapAsync http://docs.meteor.com/#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 事件循环中执行)。

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

编辑:

How to retrieve errors ?

传统的节点样式 API 函数通常将回调作为最后一个参数,在所需任务完成时最终调用该回调。此回调有 2 个参数:错误和数据,根据调用结果,任何一个都将为 null。

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

我们必须依赖于使用 try/catch block ,因为在发生错误的情况下,它会被同步函数抛出,而不是作为异步函数回调的第一个参数传递。

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);
});

why doesn't Stripe need to be passed?

JavaScript 没有“命名空间”的概念,因此 API 开发人员使用常见的技巧定义一个全局对象作为 API 命名空间,定义在这个对象上的属性是 API 的“子模块”。这意味着 Stripe.customers 是 Stripe API 的子模块,暴露了与客户相关的功能,因此这些功能 this 上下文是 Stripe.customers,而不是 Stripe

您可以通过在浏览器控制台中复制粘贴此模拟代码来自行测试:

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

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

> Stripe.customers.create();
true

关于javascript - Meteor:在服务器上正确使用 Meteor.wrapAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com