使用MeteorJS将光纤中包含的服务器端数据返回到客户端呼叫

时间:2014-02-24 05:51:23

标签: javascript meteor

我正在尝试使用服务器端方法在浏览器控制台中返回推文JSON对象。到目前为止,我的应用程序可以从Twitter API中提取信息并将所有数据插入到集合中,但它不会将数据返回给调用。我已经使用调用和方法完成了一系列测试以调试此问题,我认为光纤可能会改变此调用/方法的工作方式。

http://sf-tweet-locator.meteor.com/

我希望能够从每个对象中提取longetude和纬度,以便我可以将每条推文位置的引脚放在地图上。我不确定我这样做的方式是“最好”的方式,但我对所有建议持开放态度。

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

Meteor.methods({
  Fiber = Npm.require('fibers');

  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 });

    var wrappedInsert = Meteor.bindEnvironment(function(tweet) {
      var userName = tweet.user.screen_name;
      var userTweet = tweet.text;
      console.log(userName + " says: " + userTweet);
      Posts.insert(tweet);
      return tweet;

    }, "Failed to insert tweet into Posts collection.");

    stream.on('tweet', function (tweet) {
      wrappedInsert(tweet);
      return tweet;
    });
  }, 
})

1 个答案:

答案 0 :(得分:0)

您可以将其作为出版物 - 这样您就不会将无用的数据插入到Posts集合中,

此示例创建一个发布,它将每条新推文发送到客户端上的local-tweets集合。

如果需要引用源查询,可以将queryId传递给订阅/发布,并在每个推文文档中返回。

if (Meteor.isClient){
  var localTweets = new Meteor.Collection('local-tweets');

  Meteor.subscribe("tweets", [ '-122.75', '36.8', '-121.75', '37.8' ]);

  localTweets.observe({
    added: function(doc) { console.log('tweet received!', doc); }
  });
}

if (Meteor.isServer){
  Meteor.publish("tweets", function(bbox){
    var pub = this, stopped = false;
    var Twit = new TwitMaker({
      consumer_key: '...',
      consumer_secret: '...',
      access_token: '...',
      access_token_secret: '...'
    });
    stream = Twit.stream('statuses/filter', { locations: bbox });

    var publishTweet = Meteor.bindEnvironment(function(tweet) {
      if (stopped) return;
      pub.added("local-tweets", Random.id() /* or some other id*/, tweet);
    }, "Failed to tweet.");

    stream.on('tweet', publishTweet);

    this.ready()

    this.onStop(function(){
      /* any other cleanup? */
      stopped = true;
    });
  });

}