노드 익스프레스 서버를 올바르게 닫는 방법은 무엇입니까?


84

/auth/github/callback URL 에서 콜백을받은 후 서버를 닫아야합니다 . 일반적인 HTTP API 폐쇄 서버는 현재 server.close([callback]) API 기능을 지원 하지만 노드 익스프레스 서버에서는 TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' 오류 가 발생합니다. 그리고 저는이 문제를 해결하기위한 정보를 찾는 방법을 모릅니다.
Express Server를 닫으려면 어떻게해야합니까?

NodeJS 구성 참고 :

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

실제 애플리케이션 코드 :

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

또한 'nodejs express close…'를 찾았 지만 내가 가지고있는 코드와 함께 사용할 수 있는지 확실하지 않습니다 var app = express();..

답변:


114

app.listen()를 반환합니다 http.Server. close()인스턴스가 아닌 해당 인스턴스에서 호출해야 app합니다.

전의.

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

소스를 검사 할 수 있습니다. /node_modules/express/lib/application.js


4
이상합니다. 일부 경로에 액세스하면 닫히지 않습니다.
Uday Hiwarale 2016

1
@Uday, 나도 이것을 경험했습니다. 내 브라우저에 HTTP1.1 영구 연결이 열려 있다는 것을 알았으므로 F5를 눌렀을 때 서버가 닫히지 않은 것처럼 보입니다. 다른 브라우저를 사용하면 서버 소켓이 실행되고 있지 않습니다.
Rick Velde

즉, 내 실수였다 난에 가까운 호출 된 app대신 server. 내 하루를 구했습니다. 대단히 감사합니다 👍
Edison Spencer

48

Express v3에서는이 기능을 제거했습니다.

app.listen()함수 의 결과를 할당하고 그에 적용 하여 동일한 결과를 얻을 수 있습니다 .

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366


github.com/gajus/http-terminator 와 같은 것을 사용 하여 지속적인 연결이 있거나 응답을 생성하지 않는 요청이있는 경우 서버를 종료하십시오.
Gajus

짧고 간단합니다
krupesh Anadkat

4

Express 앱에서 오류가 발생하면 서버를 닫아야하며 다음과 같이 할 수 있습니다.

var app = express();
var server = app.listen(process.env.PORT || 5000)

오류가 발생하면 응용 프로그램은 SIGTERM

여기에서 노드 신호에 대해 자세히 읽을 수 있습니다.

https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close(() => {
    console.log('Http server closed.');
  });
});

죄송합니다. 관련이 없습니다. 질문 오류 처리에 대한 매뉴얼 서버 종료에 관한하지
블라디미르 Starkov

1

"HTTP 서버를 종료하는 방법"의 변형에 대해 여러 번 대답했습니다. 지원 채널. 안타깝게도 기존 라이브러리 는 한 가지 또는 다른 방식으로 부족 하기 때문에 추천 할 수 없습니다 . 그 이후로 나는 graceful express.js HTTP (S) 서버 종료에 대해 예상되는 모든 경우를 처리하는 패키지를 작성했습니다.

https://github.com/gajus/http-terminator

http-terminator 의 주요 이점 은 다음과 같습니다.

  • 원숭이 패치 Node.js API가 아닙니다.
  • 첨부 된 HTTP 요청없이 모든 소켓을 즉시 파괴합니다.
  • 지속적인 HTTP 요청이있는 소켓에 대한 우아한 타임 아웃을 허용합니다.
  • HTTPS 연결을 올바르게 처리합니다.
  • 연결을 설정하여 연결 유지를 사용하여 서버가 종료되고 있음을 알립니다. 헤더 닫기
  • Node.js 프로세스를 종료하지 않습니다.

답변 해 주셔서 감사합니다.하지만이 질문은 7 살입니다
Vladimir Starkov

6
유효한 질문으로 남아 있습니다.
Gajus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.