更改 Twitter 流谓词(Node.js,socket.io)

3
我正在使用Twit构建一个Twitter流,用户可以从客户端更改搜索词。搜索词将保存在缓冲区中,并根据Twitter的重新连接规则添加到流中。 我的代码大致如下:
var Twit = require('twit');

var T = new Twit({
    consumer_key:         'xxxxxxxxx'
  , consumer_secret:      'xxxxxxxxx'
  , access_token:         'xxxxxxxxx'
  , access_token_secret:  'xxxxxxxxx'
})

var searchStr = "orange";
var stream = T.stream('statuses/filter', { track: searchStr });

setInterval(function(){

    newSearchStr = getNewSearchStr();
    stream.stop();
    stream = T.stream('statuses/filter', { track:  newSearchStr});

},60*5*1000);


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

    //SAVE USER AND INTITIAL SEARCH CRITERIA
    // ...

    stream.on('tweet', function (tweet) {
        socket.emit('data',tweet);
    });

    socket.on('setSearchStr', function (searchStr) {

        //SAVE SEARCH TO BUFFER FOR getNewSearchStr() TO OBTAIN

    });
});

我的问题是如何使用新的搜索重新初始化流。
在interval函数中,stream.stop()会停止流(stream.start()也可以工作),但stream = T.stream(...)会打开一个新连接而不是更新当前连接。因此,用户正在收听的流被断开连接,用户停止接收数据直到刷新浏览器。
有没有关于如何使用Twit来解决这个问题的想法?客户端之间有什么实际差异?其他建议?
编辑: 类似问题的答案有一个过时的链接。我真的很想看到带有“更改谓词并使用户体验尽可能平稳的说明”的页面。

1个回答

3

也许不是最佳实践,但我最终通过直接编辑流对象解决了这个问题:

setInterval(function(){
    //check if criteria has changed
    if(stream.params.track != searchStr){
        console.log("Reconnecting with " + searchStr);

        stream.stop();
        stream.params.track = searchStr;
        stream.start();
    }
    else {
        console.log("Criteria unchanged");
    }
},60*5*1000);

感谢分享您的解决方案。这可能是我找到的最好的实现流式更新(或者说断开/重新连接)的示例。 - Allen Fuller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接