2013-05-30 5 views
0

저는 node.js와 socket.io에 매우 익숙하며 외부 URL에서 JSON 배열을 읽는 방법을 알아 내려고합니다. 그것을 분석하고 메인 페이지에 표시하십시오. 그런 다음 socket.io를 사용하여 연결이 열린 상태를 유지하고 변경이 발생하면 JSON 객체를 최신 상태로 유지합니다.JSON url을 NODE.JS로 구문 분석하고 SOCKET.IO로 최신 상태로 유지

이것은 지금까지 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); 

내가 로컬 호스트에 연결 : 8888 나는 "연결"을 선택한 다음 콘솔이 JSON 객체의 내용을 기록으로 콘솔 쇼를 참조하십시오. 이것은 내가 관리 할 수있는 한도 내입니다. 나는 여기, 지금은 문제를 이해하고, 감사하고

TIA 마크

+0

이, 내가 당신을 이해하도록하자 : 클라이언트에

, 그것은 단지의 문제이어야한다 당신은 당신의 JSON 개체를 얻는 코드를 가지고 있지만, 지금 당신이 원하는 Socket.IO는 들어오는 연결을 수락하여 해당 개체를 검색합니까? –

+0

안녕하세요. 솔직히 나는 socket.io가 필요하다는 것을 완전히 확신하지 못합니다. 내가 말했듯이 매우 새로운 것입니다. JSON 파일의 내용을 가져 와서 JSON 파일이 자체 내용을 업데이트하자마자 업데이트 할 페이지에 표시하고 싶습니다. – Soddengecko

+0

글쎄, 만약 당신이 진정한 push/pull으로하고 싶다면 Socket.IO 또는 다른 WebSocket 구현이 필요할 것이다. "실시간"보다 조금 덜하게하고 최종 클라이언트 페이지를 0.5 초 또는 2 초마다 당길 수 있다면 조정하는 것이 훨씬 쉽습니다. –

답변

2

좋아 도움 JSON 객체가 표시되는 것을 얻는 방법에 대한 포인터와 내 인덱스 페이지에 스타일과 최신으로 유지하는 것이 내 대답. 그것은 당신이 원하는 것을하기위한 진정한 "올바른 길"이 없기 때문에 약간의 충고가 될 것입니다. 그렇다면 우리는 WebSocket (또는 이전 브라우저에서 웹 소켓을 에뮬레이트 할 수있는 socket.io)을 사용하고자 할 것입니다.

현재 풀 코드는 괜찮을 지 모르겠지만 타임 아웃시 실행되도록 코드를 조정하여 최신 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); 
}); 

그렇게하지 여기서 disconnected 핸들을 사용하면 (connectedSockets 목록에서 연결이 끊어진 소켓이나 err'ed 소켓을 제거하고자 할 것입니다.), 실제로 실행하지는 않았지만, 어디로 향해야 할지를 알려줄 것입니다. 내가 대답을 해고하기 전에

var socket = io.connect('http://localhost:8888'); 
socket.on('data', function (data) { 
    // Data will contain your JSON object, do your DOM manip here 
}); 
+0

안녕하세요. 코드를 주셔서 대단히 감사합니다. 코드를 테스트 (캐시 파일 위치 변경)하고 몇 가지 문제가 있습니다. socket.io를 사용하고 있기 때문에 실제로 server.js 파일에서 호출해야하는지 궁금합니다. 내 index.php 페이지에 작성한 코드가 있지만 캐시 파일을 출력하기 위해 console.log를 추가했습니다. 이 작동하지 않습니다, socket.io.js 파일에 404 오류 및 "Uncaught ReferenceError : io 정의되지 않았습니다." 내가 여기에 뭔가 잘못하고 있습니까 또는 뭔가 놓치고 있습니까? 건배. – Soddengecko

+0

PHP에서 socket.io 클라이언트 라이브러리를 포함하지 않는 것이 좋습니다. 프런트 엔드에서 제공해야하는 socket.io 클라이언트 JS (이름이 나를 이스케이프 처리 함)가 있습니다. –

+0

나는 지금 어딘가에 있다고 생각한다. 데이터를 가져 와서 파일에 씁니다. socket.io가 호출되었고 index.php가 파일에 올바르게 연결되었습니다. 슬프게도 데이터가 나타나지는 않지만 당신 덕분에 나는 올바른 길을 가고 있습니다. 건배 – Soddengecko

관련 문제