Displaying streaming twitter on webpage with socke

2020-05-21 17:35发布

问题:

I'm trying to build a Twitter streaming web application using node.js socket.io and twit.

var express = require('express')
  , app = express()
  , http = require('http')
  , server = http.createServer(app)
  ,Twit = require('twit')
  , io = require('socket.io').listen(server);

server.listen(8080);

// routing
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

var watchList = ['love', 'hate'];


io.sockets.on('connection', function (socket) {
  console.log('Connected');

  var T = new Twit({
    consumer_key:         ''
  , consumer_secret:      ''
  , access_token:         ''
  , access_token_secret:  ''
})
 T.stream('statuses/filter', { track: watchList },function (stream) {

  stream.on('tweet', function (tweet) {

        io.sockets.emit('stream',tweet.text);
        console.log(tweet.text);

  });
 });
}); 

Here's my client side

 <script src="/socket.io/socket.io.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
  <script>
    $(function(){
      var socket = io.connect('http://localhost:8080');
      socket.on('tweet', function(tweet) {
    $(
        '<div class="tweet">' + tweet.text + '</div>');
        }); 

  });

  </script>
</div>

When I run node app.js and try to connect to localhost:8080 I just get a blank page, even if everything ( soket.io, jquery, ... ) seems to have loaded correctly.

Here's a sample of the server output :

info  - socket.io started
debug - served static content /socket.io.js
debug - client authorized
info  - handshake authorized pwH0dbx4WvBhzSQXihpu
debug - setting request GET /socket.io/1/websocket/pwH0dbx4WvBhzSQXihpu
debug - set heartbeat interval for client pwH0dbx4WvBhzSQXihpu
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"name":"stream","args":["RT @mintycreative: Great to chat       today RT @SharonHolistic: Treatments available tomorrow http://t.co/5Poq3KU08u Book yours now #WestMidsHou…"]}

debug - websocket writing 5:::{"name":"stream","args":["RT @laurenpeikoff: #BREAKING @ScottsdalePD confirms - police are investigating Michael Beasley for alleged sexual assault. @12News @azcentr…"]}

Hope you can help me to correct my mistakes.

回答1:

Problem solved

Here's the code without any mistakes : (server side)

var express = require('express')
  , app = express()
  , http = require('http')
  , server = http.createServer(app)
  ,Twit = require('twit')
  , io = require('socket.io').listen(server);

server.listen(8080);

// routing
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});

var watchList = ['love', 'hate'];
 var T = new Twit({
    consumer_key:         ''
  , consumer_secret:      ''
  , access_token:         ''
  , access_token_secret:  ''
})

io.sockets.on('connection', function (socket) {
  console.log('Connected');


 var stream = T.stream('statuses/filter', { track: watchList })

  stream.on('tweet', function (tweet) {

    io.sockets.emit('stream',tweet.text);


  });
 });
}); 

(client-side)

 <script src="/socket.io/socket.io.js"></script>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
  <script>

        var socket = io.connect('http://localhost:8080');
        socket.on('stream', function(tweet){
        $('#tweetd').append(tweet+'<br>');
        });
  </script>
  <div id="tweetd"></div>
</div>


回答2:

The first issue is that you are constructing a new twitter listener each time a socket connection is opened. You should move that outside of the connection event. This is likely not ideal. I'm not sure how the twitter module is handling that internally but it likely actually is creating a new connection to their API each time a websocket connects.

On the client side you jQuery could bit a bit different. If you just wanted to add a tweet to the page each time a tweet occurs, append a new tweet to the body element with $('body').append()

See this gist for reference.