2012-07-06 5 views
0

HTML5 및 node.js로 실험 중입니다. Server Sent 이벤트를 테스트 한 결과 잘 작동했습니다 (this example 참조).HTTP에 응답 SSE로 가져 오기

다음 SSE가 포함 된 버튼 인쇄기에 답장을 시도했습니다. "Increment"버튼을 누르면 텍스트 상자에서 번호를 선택하고 GET 메시지를 사용하여 서버로 전달합니다. 그러면 서버는 증가 된 숫자를 포함하는 이벤트로 응답합니다. 그런 다음 eventListener는 수신 된 숫자로 텍스트 상자를 업데이트합니다. 또한 메시지를 기록하기 위해 HTML 페이지에 "메시지 영역"을 추가했습니다.

그건 계획이었습니다. 그러나 버튼을 클릭하면 브라우저 하단에 "다운로드 중"작업이 진행 중임을 나타내지 만 완료되지 않고 결과가 화면에 업데이트되거나 페이지 하단에 메시지가 표시되지 않습니다.

페이지가로드 될 때 이벤트를 보내면 문제가 없습니다. 그러나 GET 메시지에 대한 응답으로 HTML 페이지를 보내면 응답이 표시되지 않습니다.

다음은 HTML 섹션입니다.

<form action="/upload" method="get"> 
<p>Set the temperature and click on send</p> 
<input name="temperature" id="TemperatureBox" type="text" value = "33" /> 
<button type="submit" onclick="form.action='http://localhost:8888/Increment'">Increment</button> 

나는 메시지와 Node.js를 스크립트에서 온도 상자

var source = new EventSource('/events'); 

source.addEventListener('message', function(e) { 
    //code to display message 
}, false); 

source.addEventListener('TemperatureValueUpdate', function(e) { 
     AddLog('TemperatureValueUpdate Listener >> lastEventID: ' + (e.lastEventId || '--') + 
       ', e.data: ' + e.data 
     + 'Current value of text box: ' + document.getElementById('TemperatureBox').value); 
     document.getElementById('TemperatureBox').value= e.data; 

}, false); 

를 업데이트하는 "온도 이벤트"나는 메시지와를 보내고에 대한 처리기를 추가 한 TemperatureValueUpdate

function constructTemperature(response, id, data) { 
console.log("Sending Temperature event"); 
// response.write('id: ' + (new Date()).toLocaleTimeString()+ '\n'); 
// response.write("data: " + 'Teperature event sent '+ '\n\n'); 

response.write('event: ' + 'TemperatureValueUpdate' + '\n'); 
response.write('id: ' + id + '\n'); 
response.write("data: " + data + '\n\n'); 

console.log("Finished Temperature event"); } 

또한 "페이지/이벤트"URL에 응답했습니다. 200 응답과 전자 부하 :

response.writeHead(200, {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); 

나는 전에도)는으로 Response.End를 (보내는 이벤트를

  • 를 보내기 전에 202/204 응답을 보내기 다음

    • 를 시도/보낸 후 는 A 'Content-Type을'보내기 이벤트
    • : 각 이벤트

    전에 '텍스트/이벤트 스트림을'그러나 그들은 데 생성하지 않는 싫어하는 결과. 여기서 내가 뭘 잘못하고 있니?

  • 답변

    0

    양식 제출을 할 때 constructTemperature() 함수를 호출하는 것 같습니다. 이 경우 EventSource와는 다른 연결을 사용 중입니다. 따라서 서버의 클라이언트 어딘가에 반환 할 데이터를 저장하고 EventSource에서 발생한 요청에서 constructTemperature()를 호출해야합니다.

    +0

    내가 이해할 수 있는지 보겠습니다. 페이지를 시작할 때 url은 http : // localhost : 8888 // MyApp입니다. 버튼을 누르면 URL은 http : // localhost : 8888/Increment? temperature = 33'입니다. 다른 연결에 의해, 내 경로명이 응용 프로그램 전체에서 동일하게 유지되어야한다고 말하는 것입니까? 그래서 숫자를 증가시키기 위해서 나는 현재의 것 대신에'http : // localhost : 8888 // MyApp? operation = Increment & temperature = 33'과 같은 것을 사용해야합니다. – DPD

    +0

    아닙니다. EventSource가 이벤트를 찾고있는 URL은'http : // localhost : 8888/events'입니다. 해당 URL의 응답에는'constructTemperature()'함수의 응답이 포함되어야합니다. – Maurice

    +0

    모든 HTTP 요청에 대한 URL을 'http : // localhost : 8888/MyApp'로 변경하고 이벤트 소스를'var source = new EventSource ('/ MyApp ');'로 등록하려고 시도했습니다. 나는 'req.headers.accept =='text/event-stream '조건에 따라 차별화된다. 유일한 차이점은 브라우저가 다운로드 상자를 영원히 보여주지는 않지만 문제는 여전히 지속된다는 것입니다. – DPD

    관련 문제