0

我对 node.js 和 socket.io 非常陌生,我试图弄清楚如何从外部 url 读取 JSON 数组,然后解析它并显示在主页上。然后我相信我使用 socket.io 来保持该连接打开并在发生更改时使 JSON 对象保持最新。

到目前为止,这就是我对 node.js 的了解。

var http = require("http");
var fs = require('fs');
var options = 'http://api.trakt.tv/user/watching.json/APIKEY/USERNAME';

var server = http.createServer(function(request, response){ 
  console.log('Connection');

http.get(options, function(res){
var data = '';

res.on('data', function (chunk){
    data += chunk;
});

res.on('end',function(){
    var obj = JSON.parse(data);
    console.log( obj );
})

});
  response.end(); 
}); 

server.listen(8888);

当我连接到 localhost:8888 时,我看到控制台显示“连接”,然后控制台记录 JSON 对象的内容。这是我设法得到的。对于如何在我的索引页面上显示和设置 JSON 对象并使其保持最新,我将不胜感激并提供帮助和指示

TIA 标志

4

1 回答 1

2

好的,现在我明白了问题所在,这是我的答案。这将是一些建议,因为没有真正的“正确方法”来做你想做的事。如果是,我们可以确定的是,您将要使用 WebSockets(或者在这种情况下是 socket.io,它可以在旧浏览器上模拟 websockets)。

您当前的拉取代码可能没问题,但您需要调整该代码以在超时时运行,以便每隔一段时间拉取最新的 JSON。此外,我们希望保持这个独立的各个移动部分:从 API 读取/写入缓存,侦听缓存,然后将缓存提供给连接的客户端:

var http = require("http");
var fs = require('fs');
var url = 'http://api.trakt.tv/user/watching.json/APIKEY/USERNAME';
var cacheFile = '/path/to/cachefile';
var connectedSockets = [];

function fetchJson() {
    http.get(url, function(res) {
        body = '';

        res.on('data', function(data) {
            body += data;
        });

        res.on('end', function() {
            fs.writeFileSync(cacheFile, body);
            setTimeout(fetchJson, 1000); // Fetch it again in a second
        });
    })
}

fetchJson(); // Start fetching to our JSON cache

// Start watching our cache file
fs.watch(cacheFile, function(event, filename) {
    if(event == 'change') {
        fs.readFile(cacheFile, function(data) {
            connectedSockets.forEach(function(socket) {
                socket.emit('data', JSON.parse(data));
            });
        });
    }
});

// Now setup our socket server
var io = require('socket.io').listen(8888);
io.sockets.on('connection', function(socket) {
    connectedSockets.push(socket);
});

我不在这里处理断开连接(您需要从 connectedSockets 列表中删除断开连接或出错的套接字),而且我实际上并没有运行它......但它应该让您知道去哪里。

在客户端,这应该是一个简单的问题:

var socket = io.connect('http://localhost:8888');
socket.on('data', function (data) {
    // Data will contain your JSON object, do your DOM manip here
});
于 2013-05-30T22:37:47.017 回答