问题描述
我正在尝试将流星应用程序部署到服务器上,但是在我的流星服务器日志中总是出现这个错误。
I'm trying to deploy my meteor app onto the server but it always has this error on my meteor server 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)
但是我已经把它包裹在了Fiber它在本地工作。我真的不知道可能是什么问题。感谢任何人可以帮助。
but I have already wrapped it within Fiber and it works well locally. I really do not know what could be the problem. Appreciate if anyone can help.
// server.js
//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键。感谢提前
PS:I've replace my OAuth key. Thanks in advance
推荐答案
我想你应该用 Meteor.bindEnvironment
而不是直接使用纤维 - 参见这里
i think you should wrap your callbacks with Meteor.bindEnvironment
rather than use fibers directly - see here https://gist.github.com/possibilities/3443021
我很广泛地使用它,它的效果很好,因为你留在光纤中而不是离开而不必重新输入
i use this quite extensively and it works well because you stay within the fiber rather than leaving and having to re-enter
正常回调风格
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');
}
));
如果您一直打包这样的异步回调,流星总是可以访问
if you consistently wrap async callbacks like this, meteor is always accessbile
此处
Fiber(function(){
Meteor.call('streamTwit', twit);
}).run();
你不需要光纤包裹这个,你已经在 Meteor .startup
上下文,所以这是多余的 - 只是 Meteor.call(...);
会做的伎俩
you do not need to fiber wrap this, you are already in the Meteor.startup
context, so this is redundant - just the Meteor.call(...);
will do the trick
这篇关于警告错误:当服务器上的呼叫方法时,流星码必须始终在光纤内运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!