我想在流星中的用户注册期间创建一个条带帐户,并为此目的调整Accounts.onCreateUser并提供承诺。
Accounts.onCreateUser((options, user) => {
if (user.services.facebook) {
const { first_name, last_name, email } = user.services.facebook;
user.profile = {}
user.profile.first_name = first_name
user.profile.last_name = last_name
}
else{
user.profile = options.profile
}
user.stripe = {}
return new Promise((resolve,reject) => {
stripe.customers.create({
description: user.profile.first_name + ' ' + user.profile.last_name
},function(err,response){
if (!err) {
user.stripe.id = response.id
resolve(user);
} else {
reject('Could not create user');
}
});
})
});
当用户在条带中正确创建时,meteor mongo数据库中的用户文档仅包含用户标识但不包含其他字段。
我使用承诺错了吗?任何帮助将不胜感激!
答案 0 :(得分:2)
由于onCreateUser
在服务器上运行,我们可以使用Meteor.wrapAsync
将Stripe调用包装在光纤中。
Fibers允许异步代码像同步一样运行,但仅在服务器上运行。 (Here's a great presentation on what Fibers are and why Meteor uses them)
使用wrapAsync
,代码如下所示:
Accounts.onCreateUser((options, user) => {
if (user.services.facebook) {
const { first_name, last_name, email } = user.services.facebook;
user.profile = {}
user.profile.first_name = first_name
user.profile.last_name = last_name
} else {
user.profile = options.profile
}
user.stripe = {};
const createStripeCustomer = Meteor.wrapAsync(stripe.customers.create,stripe.customers);
const response = createStripeCustomer({
description: user.profile.first_name + ' ' + user.profile.last_name
});
user.stripe.id = response.id
return user;
});
答案 1 :(得分:-1)
是的,您创建了承诺,但不要等到它结算。到onCreateUser
长期回归的时候。试试这个:
function createStripeUser(user) {
return new Promise((resolve,reject) => {
stripe.customers.create({
description: user.profile.first_name + ' ' + user.profile.last_name
},function(err,response){
if (!err) {
user.stripe.id = response.id
resolve(user);
} else {
reject(err);
}
});
})
}
Accounts.onCreateUser(async (options, user) => {
if (user.services.facebook) {
const { first_name, last_name, email } = user.services.facebook;
user.profile = {}
user.profile.first_name = first_name
user.profile.last_name = last_name
}
else {
user.profile = options.profile
}
user.stripe = {}
try {
return await createStripeUser(user);
} catch(e) {
// handle your error
}
});