2013-06-21 6 views
4

나는 서버에 내 유성 응용 프로그램을 배포하기 위해 노력하고있어하지만 항상 내 유성 서버 로그에 오류가에 호출 방법경고 오류 : 유성 코드는 항상 섬유 내에서 실행해야하는 경우 서버

Fri Jun 21 2013 11:39:31 GMT+0000 (UTC)] INFO HIT /img/bg.png 
183.90.41.21 [Fri Jun 21 2013 11:39:32 GMT+0000 (UTC)] INFO HIT /favicon.ico 183.90.41.21 [Fri Jun 21 2013 11:39:41 GMT+0000 (UTC)] INFO HIT /form 183.90.41.21 [Fri Jun 21 2013 11:39:42 GMT+0000 (UTC)] INFO HIT /favicon.ico 183.90.41.21 [Fri Jun 21 2013 11:39:49 GMT+0000 (UTC)] WARNING   }).run(); 
      ^[Fri Jun 21 2013 11:39:49 GMT+0000 (UTC)] WARNING app/server/server.js:53 [Fri Jun 21 2013 11:39:49 GMT+0000 (UTC)] WARNING Error: Meteor code must always run within a Fiber 
    at _.extend.get (app/packages/meteor/dynamics_nodejs.js:14:13) 
    at _.extend.apply (app/packages/livedata/livedata_server.js:1268:57) 
    at _.extend.call (app/packages/livedata/livedata_server.js:1229:17) 
    at Meteor.startup.Meteor.methods.streamTwit (app/server/server.js:51:22) 

하지만, 나는 이미 그것을 광섬유 (Fiber)로 싸서 로컬에서 잘 작동합니다. 나는 정말로 그 문제가 무엇인지 모릅니다. 누구든지 도울 수 있으면 감사합니다.

//server.js

Meteor.startup(function() { 
    var require = Npm.require; 
    var fs = require('fs'); 
    var path = require('path'); 
    var base = path.resolve('.'); 
    var isBundle = fs.existsSync(base + '/bundle'); 
    var modulePath = base + (isBundle ? '/bundle/static' : '/public') + '/node_modules'; 

    var ntwitter = require(modulePath + '/ntwitter'); 
    var Fiber = require(modulePath + '/fibers'); 

    var twit = new ntwitter({ 
     consumer_key: 'my key', 
     consumer_secret: 'my key', 
     access_token_key: 'my key', 
     access_token_secret: 'my key' 
    }); 

    Meteor.methods({ 
     postText : function(questionText){ 
     twit.verifyCredentials(function (err, data) { 
     if (err) { 
      console.log("Error verifying credentials: " + err); 
      process.exit(1); 
     } 
     }).updateStatus(questionText, 
     function (err, data) { 
      if (err) { 
      console.log('Tweeting failed: ' + err); 
      return false; 
      } 
      else { 
      console.log('Success!'); 
      return true; 
      } 
     } 
    ); 
    }, 

    streamTwit: function (twit){ 
     var userid = '1527228696'; 
    twit.stream(
    'statuses/filter', 
    { follow: userid}, 
     function(stream) { 
      stream.on('data', function(tweet) { 

      Fiber(function(){ 
      if(tweet.user.id_str === userid) 
      { 
       Meteor.call('addQn', tweet); 
      } 
      }).run(); 
      console.log('----------------------tracking tweet-----------------'); 
       console.log(tweet); 
       console.log('---------------------------------------------------------'); 
       console.log(tweet.user.screen_name); 
       console.log(tweet.user.name); 
       console.log(tweet.text); 
      }); 
     } 
    ); 
    }, 

    addQn:function(tweet){ 
     questionDB.insert({'tweet': tweet, 'date': new Date()}); 
    } 
    }); 
Fiber(function(){ 
    Meteor.call('streamTwit', twit); 
}).run(); 
}); 

PS : 내 OAuth는 키를 교체했습니다. 미리 감사는

답변

9

내가 사용 섬유가 직접보다는 당신이 Meteor.bindEnvironment로 콜백을 마무리해야한다고 생각 - 여기에 내가 매우 광범위 이것을 사용 https://gist.github.com/possibilities/3443021

을보고 당신이 떠나하는 것보다 오히려 섬유 내에 남아 있기 때문에 잘 작동 재 입력

정상 콜백 스타일

someMethod({OPTIONS}, function(callbackReturnArgs){ 
    //this is the normal callback 
)); 

바인드 환경 포장 콜백

someMethod({OPTIONS}, Meteor.bindEnvironment(
    function(callbackReturnArgs){ 
    //this is the normal callback 
    }, 
    function(e){ 
    console.log('bind failure'); 
    } 
)); 

당신이 지속적으로이 같은 비동기 콜백을 포장하는 경우, 유성 당신은 이미,이 포장 섬유 할 필요가 없습니다 여기에이 비트

Fiber(function(){ 
    Meteor.call('streamTwit', twit); 
}).run(); 

에 대한


accessbile 항상 Meteor.startup 컨텍스트이므로 중복 됨 - Meteor.call(...);이 트릭을 수행합니다.

+0

죄송합니다. 유성을 처음 접했는데 이해할 수 없었습니다. Meteor.bindEnvironment. 예를 제시 할 수 있습니까? 감사! –

+0

이미 bindenvironment 예제 - 나는 당신이 명확하게 차이를 볼 수 있도록 '일반적인'예제를 추가했습니다. –

+0

내가 이해하지 못하는 것은 위의 예를 어떻게 바꿀 수 있는가입니다. 내 함수는 Meteor.methods로 작성되었으며, 함수는 methodname으로 선언되었습니다 : function (params) {}, 그렇다면 someMethod는 무엇이고 {OPTIONS} params는 무엇입니까? 덕분에 –