2013-05-22 1 views
1

간단한 문제가 있습니다. 현재 요청이 응답을 끝내고 새로운 요청이 모두 거부되도록 expressjs nodejs 서버를 종료하려고합니다. 이해하기 쉽도록 코드를 정리했습니다.노드의 정상적인 종료는 작동하지 않습니다.

express = require("express") 
http = require("http") 
app = express() 

app.configure -> 
    app.set "port", process.env.PORT or 3000 
    app.use app.router 

ran = false 
app.get '/testrun', (req, res)-> 
    console.log "received request" 
    if ran 
     res.json 
      shouldnt: 'have gotten here' 
    else 
     ran = true 
     setTimeout -> 
      res.json 
       response: 'fail!' 
     , 8000 
     console.log 'server closing' 
     server.close() 
     setTimeout -> 
      process.exit() 
     , 10000 

server = http.createServer(app) 
server.listen app.get("port"), -> 
    console.log "Express server listening on port " + app.get("port") 

기본적으로 두 가지 요청을합니다. 첫 번째 작업에는 8 초가 걸리고 서버는 즉시 닫힙니다. 따라서 향후 요청은 거부되어야합니다. 그러나 두 번째 요청은 여전히 ​​처리됩니다. 콘솔 출력 :

$> Express server listening on port 3000 
received request 
server closing 
received request 

당신이 무슨 일이 일어나는지 설명 할 수 있으면 감사하겠습니다.

는 UPDATE :

당 벤자민의 반응은, 나는 그가 제시 한 테스트 코드를했는데, 예상대로 일했다. 문제는 브라우저입니다.

express = require("express") 
http = require("http") 
app = express() 

app.configure -> 
    app.set "port", process.env.PORT or 3000 
    app.use app.router 

ran = false 
app.get '/testrun', (req, res)-> 
    console.log "received request" 
    if ran 
     res.json 
      shouldnt: 'have gotten here' 
    else 
     ran = true 
     setTimeout -> 
      res.json 
       response: 'fail!' 
     , 5000 
     console.log 'server closing' # changes here 
     server.close -> 
      console.log 'closed!' 

server = http.createServer(app) 
server.listen app.get("port"), -> 
    console.log "Express server listening on port " + app.get("port") 

server.close와 관련된 변경 사항에 유의하십시오. 내가 베냐민 제안 된 테스트 코드를 실행하면 예상 출력을 얻을 :

$>Express server listening on port 3000 
received request 
server closing 
closed! 

을하지만 크롬에서 두 개의 탭을 열 때, 첫 번째 요청, 몇 초 정도 기다린 다음 두 번째 요청,이 출력을 얻을 :

$>Express server listening on port 3000 
received request 
server closing 
received request 

그리고 process.exit없이

은 '폐쇄'콜백 결코를 호출된다. 이상한 행동의 종류.

도움 주셔서 감사합니다.

답변

2

이 함수 .close()은 nodejs의 net 모듈에있는 .close을 기반으로하는 노드의 http 모듈에서 을 기반으로합니다.

API가 무엇을 말하는지 보겠습니다.

서버가 새로운 연결을 수락하는 것을 중지하고 기존 연결을 유지합니다. 이 함수는 비동기식이고, 모든 연결이 종료되고 서버가 'close'이벤트를 내면 서버가 마지막으로 닫힙니다. 선택적으로 콜백을 전달하여 'close'이벤트를 수신 할 수 있습니다.

이것은 동일한 노드 인스턴스에서 테스트 코드를 실행하고 close이 (가) 실행될 가능성이 없음을 의미합니다.

또한 setTimeout이 정확하지 않기 때문에 8,100 밀리 초 동안 setTimeout이 7980 밀리 초의 8015 밀리 초 후에 실행될 수 있습니다.나는 다른 노드 프로그램에서 코드를 테스트하려면 다음 코드를 실행하면

: 클라이언트를 실행하는 다른 윈도우가 ECONNREFUSED을 던졌습니다 내가

$ coffee test.coffee 
Express server listening on port 3000 
received request 
server closing 

얻을

http = require("http") 
http.get "http://localhost:3000/testrun" 
setTimeout http.get.bind(http,"http://localhost:3000/testrun"), 8000 
setTimeout http.get.bind(http,"http://localhost:3000/testrun"), 9000 

은 무엇 인 I '예상대로

+0

아주 좋은 대답이지만,별로 없습니다. 편집을 참조하십시오. – yourdeveloperfriend

관련 문제