Sockete.ioでNodeJSとAnglarJSの間のtweetを処理します.


この文章の中で、私達はSockete.ioを使って、サンフランシスコ周辺のtweetをどうやって流しますか?nodejs応用とanglarjs応用の間にあります.私たちはnodejsアプリからtweetをもらうために、Twitter APIのnodejsクライアントを使っています.
まず、Twitter developersでアプリケーションを作成する必要があります.読む権限だけが必要なアプリケーションを作成します.私たちの応用には十分です.今、あなたのアクセスtokenを生成します.あなたは四つのtokenが必要です.API Key、Application API Secret、Access TokenとAccess Token Secret.
Githubからソースを入手できます.ここからオンラインの例を訪問します.
サンフランシスコ周辺のtweetsに持ってきてください.nodejsとTwitを通じて.
nodejsでtweetsを取得するためには、Twitを配置する必要があります.
<!-- lang: js -->
var Twit = require('twit');
var TWEETS_BUFFER_SIZE = 3;

var T = new Twit({
    consumer_key:         'API Key',
    consumer_secret:      'API Secret',
    access_token:         'Access Token',
    access_token_secret:  'Access Token Secret'
})
それから、私たちは一つのストリームを開くことができます.位置パラメータとtweetイベントを加えて、status/filterを指します.推進があると、このイベントはトリガされます.
<!-- lang: js -->
console.log("Listening for tweets from San Francisco...");
var stream = T.stream('statuses/filter', { locations: [-122.75,36.8,-121.75,37.8] });
var tweetsBuffer = [];

stream.on('connect', function(request) {
    console.log('Connected to Twitter API');
});

stream.on('disconnect', function(message) {
    console.log('Disconnected from Twitter API. Message: ' + message);
});

stream.on('reconnect', function (request, response, connectInterval) {
  console.log('Trying to reconnect to Twitter API in ' + connectInterval + ' ms');
})

stream.on('tweet', function(tweet) {
    if (tweet.geo == null) {
        return ;
    }

    //Create message containing tweet + username + profile pic + geo
    var msg = {};
    msg.text = tweet.text;
    msg.geo = tweet.geo.coordinates;
    msg.user = {
        name: tweet.user.name,
        image: tweet.user.profile_image_url
    };

    console.log(msg);
});
tweetイベントでは、受信したデータを通じて、プッシュのみを含むコンテンツ、座標、ユーザおよびユーザ写真の情報を作成します.今はどうやってSockete.IOを使ってこのプッシュを流して、nodejsとanglarjsの間で交流するかを見てみます.
Streaming tweets with Sockett.IO
まず私達はsocket.ioを配置して、expressサービスと一緒に仕事させます.
<!-- lang: js -->
var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);
今、local host:3000/socket.io/socket.io.jsに転向したら、socket.ioのクライアントを入手できます.私たちは私たちのsocket.ioを使ってすべてのリンク上のクライアントに情報を放送すればいいです.だからtweetイベントを変更します.
<!-- lang: js -->
stream.on('tweet', function(tweet) {
    if (tweet.place == null) {
        return ;
    }

    //Create message containing tweet + username + profile pic + location
    var msg = {};
    msg.text = tweet.text;
    msg.location = tweet.place.full_name;
    msg.user = {
        name: tweet.user.name,
        image: tweet.user.profile_image_url
    };

    //push msg into buffer
    tweetsBuffer.push(msg);

    //send buffer only if full
    if (tweetsBuffer.length >= TWEETS_BUFFER_SIZE) {
        //broadcast tweets
        io.sockets.emit('tweets', tweetsBuffer);
        tweetsBuffer = [];
    }
});
この案は使えるが、一番いい案ではない.もしあなたがビジネスリンクを持っていないなら、やはりtweetをどこでも乱発します.私たちは帯域幅を考慮しなければならない.どこでも騒ぎ出さないために、クライアントにリンクされたレコードを記録しなければなりません.この数が0なら、転送しません.
<!-- lang: js -->
var nbOpenSockets = 0;

io.sockets.on('connection', function(socket) {
    console.log('Client connected !');
    if (nbOpenSockets <= 0) {
        nbOpenSockets = 0;
        console.log('First active client. Start streaming from Twitter');
        stream.start();
    }

    nbOpenSockets++;

    socket.on('disconnect', function() {
        console.log('Client disconnected !');
        nbOpenSockets--;

        if (nbOpenSockets <= 0) {
            nbOpenSockets = 0;
            console.log("No active client. Stop streaming from Twitter");
            stream.stop();
        }
    });
});
AnglarJS側では、Socket.IOを通じて情報を受信します.
nodejsアプリケーションは、ツイッターを取得し、ブロードキャストをリンクされたクライアントに転送することができる.どのようにアングラーJSクライアントを作成するかを見てみます.まず私たちはserviceを創立して、私たちのサーバーにリンクして、受信イベントを処理する必要があります.
<!-- lang: js -->
appServices.factory('socket', function ($rootScope) {
    var socket = io.connect('http://localhost:3000');
    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    callback.apply(socket, args);
                });
            });
        }
    };
});
そして、私たちはこのサービスを使ってサービス端末から放送されたtweetイベントを監督することができます.
<!-- lang: js -->
$scope.tweets = [];

socket.on('tweets', function (data) {
    $scope.tweets = $scope.tweets.concat(data);
});
トーチカになりました.私たちのAnglarアプリケーションはSocket.IOを通じてnodejsから送られてきたメッセージを受け取りました.