2011-04-13 5 views
0

나는 혜성 서버로 nodeJS를 사용할 계획이며 테스트를 위해 몇 가지 코드를 썼다. 그러나 클라이언트가 서버에 처음 연결되었을 때 서버로부터 응답을 얻을 수 없다는 문제가있다.왜 내가 nodeJS 'httpServer에서 처음 몇 응답을 얻을 수 없었습니까?

var util = require('util'); 
var redis = require('redis').createClient(6379, '192.168.1.254'); 
var http = require('http'); 
redis.on("error", function (err) { 
    console.log("Error " + err); 
}); 

var server = http.createServer(requestListener); 
server.listen(9898, '192.168.1.254'); 

function requestListener(req, res) { 
     util.log('Connected.'); 
     redis.brpoplpush('msg:q:1', 'msg:s:1', 20, function(err, reply) { 
       if (err) { 
         util.log('ERROR: ' + err); 
       } 
       var length = reply ? reply.length : 0; 
       res.writeHead(200, { 
         'Content-Type':'text/plain', 
         'Content-Length':length 
       }); 
       if (length) { 
         res.end(reply); 
         util.log('Sent: ' + reply); 
       } else { 
         res.end(''); 
       } 
     }); 
} 

그리고 클라이언트 코드 (client.sh) :

#!/bin/bash 
while [ 1 ] 
do 
     curl -i http://192.168.1.254:9898 
done 

내가 그것을 테스트 다음 단계 :

다음

은 서버 측 코드 (server.js)입니다
  1. node server.js
  2. ./client.sh
  3. 레디 스에서 91,363,210
  4. 는 LPUSH ('메시지 : Q : 1', 'blablah') 이제

, "받는 사람 : blablah는"res.end(reply)이 excuted, 콘솔에 인쇄하지만, 클라이언트는 아무것도받지 않습니다. 3 단계를 여러 번 반복하면 예상대로 작동합니다. 클라이언트를 다시 시작하면 처음 몇 개의 응답을 다시 수신 할 수 없습니다.

어떻게 해결할 수 있습니까?

+0

무한 while 루프를 사용하지 말고 for 루프를 최대 5 개 또는 10 개 사용하십시오. 그런 다음 계속 발생하는지 확인하십시오. – Raynos

+0

Raynos : 고마워. 클라이언트가 응답을 기다리는 블로킹 모드에 있습니다. 명령 'curl -i http : // ...'을 실행하면 변경된 사항은 없지만 여전히 응답을 얻을 수 없습니다. – Zillion

+0

는 붉게 보이는 것처럼 보입니다. 나에게 노드 코드는 괜찮아 보인다. – Raynos

답변

1

나는 여기에서 일어날 수있는 일은 당신이 말쑥해진 반응을 기다리는 동안 말림을 중단했다는 것입니다. HTTP 클라이언트가 중단 된 후 redis 명령은 계속 활성 상태를 유지합니다. 그런 다음 다른 요소를 대기열로 밀어 넣으면 redis 명령은 반환하지만 HTTP 응답을 작성하지 않습니다. curl 루프를 다시 시작하면 대기열이 비어있는 것입니다.

다음은 응답을 스트리밍하고 클라이언트 중단을 감지 한 프로그램의 수정 된 버전입니다. 요소를 대기열에 다시 넣지는 않지만 확실히 그렇게 할 수도 있습니다.

var util = require('util'); 
var redis = require('redis').createClient(); 
var http = require('http'); 

redis.on("error", function (err) { 
    console.log("Redis error " + err); 
}); 
redis.on("ready", function() { 
    console.log("Redis client ready"); 
}); 

var server = http.createServer(requestListener); 
server.listen(9898); 

function requestListener(req, res) { 
    var aborted = false; 

    res.writeHead(200, { 
     "Content-Type": "text/plain" 
    }); 
    res.write("Checking redis...\n"); 
    redis.brpoplpush('q', 's', 20, function (err, reply) { 
     if (aborted) { 
      return console.log("Client aborted before redis reply came back."); 
     } 

     if (err) { 
      return res.end("Redis error"); 
     } 

     res.end("Redis reply: " + reply); 
    }); 
    req.on("aborted", function() { 
     console.log("HTTP client aborted."); 
     aborted = true; 
    }); 
} 
관련 문제