2017-03-25 8 views
0

の内側にコールバックをラップするMeteor.wrapAsyncを使用した:この流星コードがエラーを与えている方法

Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

私は無駄のためMeteor.bindEnvironmentを試してみましたが、Meteor.wrapAsyncを試してみたいです。私はdocsからそれを理解することができませんでした。文法を教えてくれる人もいますか? THX

Meteor.methods({ 
'createTransaction': 
    function (nonceFromTheClient, Payment) { 
     let user = Meteor.user(); 
     gateway.transaction.sale(
     { 
      arg_object 
     }, 
      function (err, success) { 
      if (!err) { 
       //do stuff here 
      } 
      } 

    ); 
    } 
}); 

答えて

0

Meteor.wrapAsync

Meteor.methods({ 
'createTransaction': 
    function (nonceFromTheClient, Payment) { 
     this.unblock(); 
     let user = Meteor.user(); 
     var sale = Meteor.wrapAsync(gateway.transaction.sale); 
     var res = sale({arg_object}); 
     future.return(res); 
     return future.wait(); 
    } 
}); 

またはファイバー

var Fiber = Npm.require('fibers'); 
Meteor.methods({ 
'createTransaction': function (nonceFromTheClient, Payment) { 
    Fiber(function() { 
     let user = Meteor.user(); 
     gateway.transaction.sale(
     { 
      arg_object 
     }, 
      function (err, success) { 
      if (!err) { 
       //do stuff here 
      } 
      } 
    ); 
    }).run() 
    } 
}); 

アップデートでそれをラップしてみてくださいでラップ:ここで私はAsync.runSyncとMeteor.bindEnvironmentでストライプを処理する方法です

var stripe = require("stripe")(Meteor.settings.private.StripeKeys.secretKey); 

Meteor.methods({ 
    'stripeToken': function() { 
     this.unblock(); 
     var future = new Future(); 
     var encrypted = CryptoJS.AES.encrypt(Meteor.userId(), userIdEncryptionToken); 
     future.return(encrypted.toString()); 
     return future.wait(); 
    }, 
    'stripePayment': function(token) { 
     var userId = Meteor.userId(); 
     var totalPrice = 0; 
     //calculate total price from collection 
     totalPrice = Math.ceil(totalPrice * 100)/100; 
     userEmail = Meteor.users.findOne({ 
      '_id': userId 
     }).emails[0].address; 

     // Create a charge: this will charge the user's card 
     var now = new Date(); 
     Async.runSync(function(done) { 
      var charge = stripe.charges.create({ 
       amount: Math.ceil(totalPrice * 100), // Amount in cents // coverting dollars to cents 
       currency: "usd", 
       source: token, 
       receipt_email: userEmail, 
       description: "Charging" 
      }, Meteor.bindEnvironment(function(err, charge) { 
       if (err) { 
        //handle errors with a switch case for different errors  
        done(); 
       } else { 
        //handle res, update order 
       } 
      })); 
     }); // Async.runSync 
    }, 
}); 
+0

wrapAsyncを使用する最初のコードブロックでは、 '{arg_object}'に 'gateway.transaction.sale'のコールバックも含まれていますか?未解決の変数なので 'future'をどう扱うのでしょうか? –

+0

また、2番目のコードブロックを試しましたが、同じエラーが表示されます。 –

+0

'arg_object'はコールバックを非同期にラッピングするため、コールバックを含みません。メソッドの戻り値は、コールバックを持つ通常のメソッドと同じ方法で処理します。 'Meteor.call( 'createTransaction'、nonce、payment、function(err、res){...})' – mutdmour

関連する問題