【问题标题】:WARNING Error: Meteor code must always run within a Fiber when call method on server警告错误:在服务器上调用方法时,Meteor 代码必须始终在 Fiber 内运行
【发布时间】:2013-06-21 12:16:26
【问题描述】:

我正在尝试将我的流星应用程序部署到服务器上,但它总是在我的流星服务器日志中出现此错误

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 密钥。提前致谢

【问题讨论】:

    标签: mongodb deployment meteor


    【解决方案1】:

    我认为你应该用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');
      }
    ));
    

    如果你一直像这样包装异步回调,meteor 总是可以访问的


    这里是这个位

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

    你不需要用纤维包裹它,你已经在 Meteor.startup 上下文中,所以这是多余的 - 只需 Meteor.call(...); 就可以了

    【讨论】:

    • 抱歉,我是新来的流星,我无法理解 Meteor.bindEnvironment。你可以提供一个例子吗?谢谢!
    • 已经是一个 bindenvironment 示例 - 我添加了“正常”示例,以便您可以清楚地看到差异
    • 我不明白如何将其更改为您上面的示例。我的函数是在 Meteor.methods 上编写的,函数被声明为 methodname: function(params){},如果是,那么 someMethod 到底是什么以及 {OPTIONS} 参数是否是?谢谢
    • 为什么回调函数默认不被它包裹?它会影响性能吗?
    猜你喜欢
    • 2015-03-02
    • 2012-04-28
    • 2013-12-01
    • 1970-01-01
    • 2017-10-03
    • 2017-08-16
    • 2018-01-16
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多