[英]Using Streaming Data from Twitter with Meteor
到目前為止,我已經能夠從Twitter下載流式實時數據。 我該如何使用這些數據? 我試圖將其插入集合,但我收到此錯誤:
錯誤:流星代碼必須始終在光纖內運行。 嘗試使用Meteor.bindEnvironment包裝傳遞給非Meteor庫的回調。
我嘗試用光纖包裝我的代碼,但它不起作用/或者我沒有包裝正確的代碼部分。 此外,我不確定這是否是在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);
});
}
這適合我。 必不可少的是從Twit回調中調用Meteor.bindEnvironment
。
Meteor.methods({
consumeTwitter: function () {
var Twit = Meteor.npmRequire('twit');
var T = new Twit({
consumer_key: 'xxx', // API key
consumer_secret: 'yyy', // API secret
access_token: 'xxx',
access_token_secret: 'xxx'
});
// search twitter for all tweets containing the word 'banana'
var now = new Date().getTime();
var wrappedInsert = Meteor.bindEnvironment(function(tweet) {
Tweets.insert(tweet);
}, "Failed");
T.get('search/tweets',
{
q: 'banana since:2011-11-11',
count: 4
},
function(err, data, response) {
var statuses = data['statuses'];
for(var i in statuses) {
wrappedInsert(statuses[i]);
}
}
)}
});
我寫過一篇關於使用Scratch的MeteorJS 構建Twitter監控應用程序的長篇文章,包括Meteor.bindEnvironment部分,摘錄如下。
var Twit = Meteor.npmRequire(‘twit’);
var conf = JSON.parse(Assets.getText(‘twitter.json’));
var T = new Twit({
consumer_key: conf.consumer.key,
consumer_secret: conf.consumer.secret,
access_token: conf.access_token.key,
access_token_secret: conf.access_token.secret
//
// filter the twitter public stream by the word ‘iwatch’.
//
var stream = T.stream(‘statuses/filter’, { track: conf.keyword })
stream.on(‘tweet’, Meteor.bindEnvironment(function (tweet) {
console.log(tweet);
Tweets.insert(tweet);
}))
只添加了兩個功能:
Meteor.bindEnvironment()
此函數可幫助我們將函數綁定到所有環境變量的當前值。
玩得開心!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.