2017-10-30 3 views
1

メテオのユーザー登録時にストライプアカウントを作成し、その目的のために約束したAccounts.onCreateUserを調整したいとします。ユーザーが正しくストライプで作成されたものの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'); 
     } 

    }); 
    }) 
}); 

、流星のmongoデータベース内のユーザー文書は、ユーザーIDが、ありません、他のフィールドが含まれています。

私は約束を間違って使用していますか?どんな助けもありがとう!

答えて

1

onCreateUserための実行を、我々はMeteor.wrapAsyncを使用してファイバにストライプの呼び出しをラップすることができます。

ファイバーを使用すると、非同期コードを同期しているかのように実行できますが、サーバー上でのみ実行できます。 wrapAsync付(Here's a great presentation on what Fibers are and why Meteor uses them

コードは次のようになります。非同期関数は常に約束を返すので、 `Accounts`が直接に挿入されるユーザーオブジェクトを期待されながら、これはまだ、動作しません

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

Meteor.wrapAysncを指してくれてありがとう。上記のようにコードを実行すると、実行時に次のエラーが発生します。 I20171031-23:52:26.808(-4)?メソッド 'ATCreateUserServer'を呼び出す際の例外TypeError:this.createUrlDataは関数ではありません I20171031-23:52:26.809(-4)? /home/dev/Projects/node_modules/stripe/lib/StripeMethod.js:32:24 I20171031-23:52:26.809(-4)?パッケージ/ meteor.js:212:23 AccountsServer._onCreateUserHook(imports/startup/server/accounts.js:18:20) 私はストリップnpmパッケージを使用しています:https://www.npmjs.com/パッケージ/ストライプ –

+1

私はそれを理解し、stripe.customersに2番目の関数としてstripe.customersを追加する必要がありました。 var createStripeCustomer = Meteor.wrapAsync(stripe.customers.create、stripe.customers) 私に正しい方法を教えてくれてありがとう! :) –

+0

素晴らしい!私はバインディングビットについても言及していたはずです。私はあなたの編集を受け入れました –

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

db –

+0

Fredが正しい - ユーザーオブジェクトが返されると予想される –