现在使用解决方案进行编辑
我正在编写一个由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] });
}
}
});
});