2015-09-23 12 views
5

Meteorを使用して非常に単純なサーバーを作成しましたが、タイムアウト後に電子メールを送信しました。タイムアウトを使用すると、メッセージは正常に送信されますが、エラーがスローされます。[Error: Can't wait without a fiber]私は、繊維を作成するためにMeteor.wrapAsyncを使用することができることを理解しMeteor [エラー:Email.sendへの呼び出し後にファイバーなしで待機できません]

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    // <DUMMY VALUES: PLEASE CHANGE> 
    process.env.MAIL_URL = 'smtp://me%40example.com:[email protected]:25'; 
    var to = '[email protected]' 
    var from = '[email protected]' 
    // </DUMMY> 
    // 
    var subject = 'Message' 
    var message = "Hello Meteor" 

    var eta_ms = 10000 
    var timeout = setTimeout(sendMail, eta_ms); 
    console.log(eta_ms) 

    function sendMail() { 
     console.log("Sending...") 
     try { 
     Email.send({ 
      to: to, 
      from: from, 
      subject: subject, 
      text: message 
     }) 
     } catch (error) { 
     console.log("Email.send error:", error) 
     } 
    } 
    }) 
} 

は、ここに私のコードです。しかし、wrapAsyncはコールバックコールバックがあると予想し、Email.sendはコールバックを使用しません。

エラーを取り除くにはどうすればよいですか?

答えて

9

これは、あなたのMeteor.startup機能が(ほとんどの他のMeteorコールバックのように)Fiber内で実行されている間に発生します。setTimeoutは使用しません! setTimeoutという性質のため、関数を定義したり呼び出すファイバーの外側で、最上部のスコープで実行されます。

setTimeout(Meteor.bindEnvironment(sendMail), eta_ms); 

をそして痛々しいほど硬いという事実であるsetTimeoutにすべての単一の呼び出し、ためにそう:

あなたは Meteor.bindEnvironmentようなものを使用することができ、解決します。
実際にはうまくいきません。単にネイティブの代わりに Meteor.setTimeoutを使用します。

Meteor.setTimeout(sendMail, eta_ms); 

をドキュメントから:

These functions work just like their native JavaScript equivalents. If you call the native function, you'll get an error stating that Meteor code must always run within a Fiber, and advising to use Meteor.bindEnvironment

流星タイマーだけbindEnvironment then delay the callをあなたが望んでいたよう。

関連する問題