Accounts.onCreateUser中的流星承诺

时间:2017-10-30 14:30:39

标签: meteor meteor-accounts

我想在流星中的用户注册期间创建一个条带帐户,并为此目的调整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数据库中的用户文档仅包含用户标识但不包含其他字段。

我使用承诺错了吗?任何帮助将不胜感激!

2 个答案:

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