WARNING Error: Meteor code should always be executed inside Fiber when the call method on the server

I am trying to deploy my meteor application on a server, but always have this error in the meteor log

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) 

but I already wrapped it in Fiber and works well locally. I really don't know what the problem is. Appreciate if someone can help.

//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: I am replacing my OAuth key. thanks in advance

+4
source share
1 answer

I think you should wrap your callbacks with Meteor.bindEnvironment and not use fibers directly - see here https://gist.github.com/possibilities/3443021

I use this quite extensively and it works well because you stay inside the fiber, not leave and have to re-enter

normal callback style

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

associate the environment with a completed callback

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

if you sequentially exchange asynchronous callbacks like this, a meteorite is always available


for this bit here

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

you do not need to wrap this fiber, you are already in the context of Meteor.startup , so this is redundant - only Meteor.call(...); will do the trick

+9
source

Source: https://habr.com/ru/post/1487463/