微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 使用来自Twitter的流媒体数据与Meteor

到目前为止,我已经能够从Twitter下载流式实时数据.我该如何使用这些数据?我试图将其插入集合,但我收到此错误

Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.

我尝试用光纤包装我的代码,但它不起作用/或者我没有包装正确的代码部分.此外,我不确定这是否是在Meteor中使用流数据的正确方法.

Posts = new Meteor.Collection('posts');

if (Meteor.isClient) {
  Meteor.call("tweets",function(error,results) {
    console.log(results); //results.data should be a JSON object
  });
}

if (Meteor.isServer) {    
  Meteor.methods({
    tweets: function(){

      Twit = new TwitMaker({
        consumer_key: '...',consumer_secret: '...',access_token: '...',access_token_secret: '...'
      });

      sanFrancisco = [ '-122.75','36.8','-121.75','37.8' ];

      stream = Twit.stream('statuses/filter',{ locations: sanFrancisco });


      stream.on('tweet',function (tweet) {
        userName = tweet.user.screen_name;
        userTweet = tweet.text;
        console.log(userName + " says: " + userTweet);
        Posts.insert({post: tweet})

      })  
    }    
  })  
}

解决方法

变异数据库代码需要在光纤中运行,这就是错误所在.从Meteor以外的库回调运行的代码不一定(必然)在光纤中运行,因此您需要包装回调函数以确保它在光纤中运行,或者至少在光纤中运行与数据库交互.
Meteor.bindEnvironment目前尚未记录,但通常被认为是包装回调的最可靠方法.错误所述的Meteor.bindEnvironment在此处定义以供参考:
https://github.com/meteor/meteor/blob/master/packages/meteor/dynamics_nodejs.js#L63

这样的事情可能是最简单的方法

tweets: function() {
  ...

  // You have to define this wrapped function inside a fiber .
  // Meteor.methods always run in a fiber,so we should be good here. 
  // If you define it inside the callback,it will error out at the first
  // line of Meteor.bindEnvironment.

  var wrappedInsert = Meteor.bindEnvironment(function(tweet) {
    Posts.insert(tweet);
  },"Failed to insert tweet into Posts collection.");

  stream.on('tweet',function (tweet) {
    var userName = tweet.user.screen_name;
    var userTweet = tweet.text;
    console.log(userName + " says: " + userTweet);
    wrappedInsert(tweet);
  });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐