2012-04-01 4 views
4

막연한 질문에 대해 사과드립니다.하지만 문제가 무엇인지 잘 모르겠습니다. JSON 데이터를 웹 응용 프로그램에 제공하는 데 사용하는 노드 http 서버가 있습니다. 그것은 잘 작동하지만 JSON 문자열이 커지기 시작 (10-12 MB)하므로 zlib로 압축을 추가하고 싶습니다.Node.JS 압축 된 HTTP 서버 - 응답으로 변수를 보내십시오.

JSON 데이터가 문자열 변수이며 압축하여 응답 객체에 쓰고 싶지만 클라이언트에 돌아가는 결과는 항상 완벽한 헤더와 내용이없는 것처럼 보입니다. 여기 내 deliverResponse 기능입니다 : ZLIB 사용 스트림 파이프 기능

var deliverResult = function (data, response, callback, acceptEncoding){ 
    var payload = callback + '(' + JSON.stringify(data) + ');'; 

    if (acceptEncoding.match(/\bdeflate\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'deflate', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.deflate(payload, function(err, result){ 
      if(!err){ 
       //console.log(result.toString('utf8')); // I have data on the console here 
       response.write(result.toString('utf8')); // No data sent here 
      } 
     }); 
    } else if (acceptEncoding.match(/\bgzip\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'gzip', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.gzip(payload, function(err, result){ 
      if(!err){ 
       response.write(result.toString('utf8')); 
      } 
     }); 
    } else { 
     writelog('INFO', 'Returning data without compression\n'); 
     response.writeHead(200, { 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     response.write(payload); 
    } 

    response.end(); 
} 

HTTP 서버 예,하지만 난 데이터베이스 응용 프로그램에서 JSON 데이터를 생성로서 나는 파일을 전송하고 있지 않다, 그래서 나는 편의 방법 예제를 기반으로합니다. 내 문제 해결 지금까지는 응답 객체가 좋음을 알고 result.toString ('utf8')은 gobeldy-gook을 예상대로 출력합니다. 서버에 acccept 인코딩 헤더를 보내지 않으면 일반 텍스트가 완벽하게 전송되므로 압축 기능이 있어야합니다.

누구든지 이에 대해 알 수 있습니까? 스트림, 파이프, 버퍼 및 zlib 객체에 대한 이해가 부족하다는 점에 대해서는 거의 확신하지 못했습니다. 아마도 구문 문제 일 뿐이므로 희망을 갖고이 모든 것을 이해하는 사람이 나를 도울 수 있습니다.

건배

해결
+0

JSON이 다운로드 용인 것으로 가정합니다. 브라우저를 질식 시키십시오 :) –

+0

아니요, 실시간 매핑 응용 프로그램의 위치 데이터입니다. 대부분의 브라우저에는 문제가 없습니다. – whiteatom

답변

2

....

바보 같은 문제가 있습니다 .. Response.Write에는 비동기 함수 호출되고, 그래서 전송되는 Response.Write를하고 빈 응답하기 전에 write.end을()하고있어 ... 응답을 콜백에서 response.end로 바꾸면 완벽하게 작동합니다.