如何添加以在node.js中添加socket.io订阅者而无需重新运行安装代码

时间:2014-10-12 15:30:32

标签: node.js twitter socket.io

现在使用解决方案进行编辑

我正在编写一个由Node and Express支持的网页,该网页使用twitter流API将包含给定单词的推文的位置绘制到Google地图上。该页面连接到服务器,并将每条推文放置在服务器发布到地图上的位置。

节点js应用程序就是这个。 twitFactory只是通过我的各种连接字符串从Twitter npm模块给我一个twitter对象。

'use strict';

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var twitFactory = require('./lib/twitFactory');
var twit = twitFactory.twit();

var searchTerm = process.argv[2];
var locations = '-180,-90,180,90';
server.listen(3000);

app.use('/bower_components', express.static(__dirname + '/bower_components'));

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

io.on('connection', function (socket) {

    twit.stream('filter', {locations: locations}, function (stream) {
        stream.on('data', function (tweet) {
            if (tweet.text && tweet.text.toLowerCase().indexOf(searchTerm.toLowerCase()) != -1) {
                if (tweet.text && tweet.coordinates && tweet.coordinates.coordinates && tweet.coordinates.type === 'Point') {
                    socket.emit('tweet', { text: tweet.text, lon: tweet.coordinates.coordinates[0], lat: tweet.coordinates.coordinates[1] });
                }
            }
        });
    });
});

我有一个适用于单个Web客户端的工作,这对我的开发环境很好,但是我想避免每次新客户端连接时重新初始化连接事件中的Twitter连接,否则我会很快打到我的API调用限制。

我想我想单独定义twitter流,然后向socket的订阅者添加新的连接,但是不知道如何对其进行编码,而没有上面看到的嵌套结构。 / p>

(我发现使用位置获取所有推文然后根据内容进行过滤效率非常低效,但很少有推文附加位置,并且API目前不允许您指定位置和搜索字词,它会为您提供所有推文都有。)

更新:

我找到了一个解决方案,即使用不同的Twitter Node模块,它允许分别声明流对象和事件。在npm中它是twit(而不是twitter)。代码现在看起来像这样:

'use strict';

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var logger = require('./lib/logger');
var twitFactory = require('./lib/twitFactory');
var searchTerm = process.argv[2];
var locations = ['-180','-90','180','90'];

var twit = twitFactory.twit();
var tweetStream = twit.stream('statuses/filter', {locations: locations});

server.listen(3000);

app.use('/bower_components', express.static(__dirname + '/bower_components'));

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

io.on('connection', function (socket) {
    console.log('new connection');
    tweetStream.on('tweet', function (tweet) {    
        if (tweet.text && tweet.text.toLowerCase().indexOf(searchTerm.toLowerCase()) != -1) {    
            if (tweet.text && tweet.coordinates && tweet.coordinates.coordinates && tweet.coordinates.type === 'Point') {
                socket.emit('tweet', { text: tweet.text, lon: tweet.coordinates.coordinates[0], lat: tweet.coordinates.coordinates[1] });
            }
        }
    });
});

0 个答案:

没有答案