Express.js-app.listen 및 server.listen


439

이것은 매우 기본적인 질문 일 수는 있지만 간단하게 알 수는 없습니다. Express.js를 사용하여 앱을 만들고 1234 포트에서 앱 수신을 시작 하는 것의 차이점은 다음 과 같습니다.

var express = require('express');
var app = express();

//app.configure, app.use etc

app.listen(1234);

http 서버 추가 :

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

차이점이 뭐야?
로 이동 http://localhost:1234하면 동일한 출력이 나타납니다.


25
한동안 이걸 궁금해 했어요 ... 좋은 질문입니다!
Stijn de Witt

2
이 질문이 오래되었다는 것을 알고 있지만 createServer가 감가 상각되었습니다.
Philip Kirkbride

@PhilipKirkbride 증거를 제공해 주시겠습니까?
yanot

12
@PhilipKirkbride 나는 그것이 다소 오해의 소지가 있다고 생각합니다. ExpressJS의 createServer () 메소드는 더 이상 사용되지 않지만 Node.js HTTP 모듈은 여전히 ​​createServer ()를 사용하며 더 이상 사용 되지 않습니다.
Tamas

답변:


562

두 번째 양식 (Express에서 직접 작성하지 않고 직접 HTTP 서버 작성)은 HTTP 서버를 재사용하려는 경우 ( socket.io예 : 동일한 HTTP 서버 인스턴스 내에서 실행) 유용 합니다.

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);

그러나 app.listen()HTTP 서버 인스턴스도 반환하므로 약간만 다시 작성하면 HTTP 서버를 직접 만들지 않고도 비슷한 것을 얻을 수 있습니다.

var express   = require('express');
var app       = express();

// app.use/routes/etc...

var server    = app.listen(3033);
var io        = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  ...
});

2
그래서 require ( 'http "). createServer (require ("express ")). listen (80) === require ("express ") (). listen (80)?
user2167582

7
@ user2167582 효과는 동일하지만 물론 문자 ===비교는 실패합니다.) 나를 믿지 않으면 항상 소스가 있습니다.
robertklep

1
입니다 var socketio = require('socket.io')귀하의 재 작성에 필요한 세 번째 줄에?
davidx1

1
각각의 장단점?
Tanner Summers

2
@TannerSummers app.listen()코드가 덜 필요 하기 때문에 실제로 항상 사용 합니다. 의 맨 위에있는 매우 얇은 계층 server.listen()이고 서버 인스턴스를 반환하므로 일반적으로 별도의 HTTP 서버 인스턴스를 수동으로 생성 할 이유가 없습니다.
robertklep

64

https 서버를 설정하려는 경우 앱을 사용하고 http 서버를 듣는 것의 차이점이 하나 더 있습니다.

https를 설정하려면 아래 코드가 필요합니다.

var https = require('https');
var server = https.createServer(app).listen(config.port, function() {
    console.log('Https App started');
});

express의 앱은 http 서버 만 반환하므로 명시 적으로 설정할 수 없으므로 https server 명령을 사용해야합니다.

var express = require('express');
var app = express();
app.listen(1234);

30

시간 엄수를 위해 약간의 Tim 답변을 확장하십시오.
에서 공식 문서 :

express ()에 의해 반환 된 앱은 실제로 요청을 처리하기위한 콜백으로 Node의 HTTP 서버에 전달되도록 설계된 JavaScript 함수 입니다.

이렇게하면 앱이 이들로부터 상속받지 않기 때문에 동일한 코드 기반으로 앱의 HTTP 및 HTTPS 버전을 모두 쉽게 제공 할 수 있습니다 (단순히 콜백 임).

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

app.listen () 메소드가 다시 표시 http.Server 객체와 (대한 HTTP)은 인 간이 메소드 다음에 :

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

1
두 번째 코드에 대해 좀 더 자세히 설명해주세요. 편리한 방법으로 정확히 무엇을 의미합니까?
Aakash Verma

@AakashVerma 이것은 exress의 소스 코드에 불과하며 express/lib/appplication.js노드의 http 서버를 만드는 바로 가기에 불과합니다.
Ivan Talalaev

따라서 우리는 express () by app을 콜백으로 사용하면 외부 HTTP 서버 (80 또는 443을 통해)에서 요청을 수신 한 다음 자체 내에 다른 가상 서버 http.Server를 생성하고 청취하는 데 사용합니다. 전달 된 요청에
Aakash Verma

10

나는 같은 질문을했지만 Google 후 큰 차이가 없다는 것을 알았습니다. :)

에서 Github에서

HTTP 및 HTTPS 서버를 모두 작성하려면 여기에 표시된대로 "http"및 "https"모듈을 사용하십시오.

/**
 * Listen for connections.
 *
 * A node `http.Server` is returned, with this
 * application (which is a `Function`) as its
 * callback. If you wish to create both an HTTP
 * and HTTPS server you may do so with the "http"
 * and "https" modules as shown here:
 *
 *    var http = require('http')
 *      , https = require('https')
 *      , express = require('express')
 *      , app = express();
 *
 *    http.createServer(app).listen(80);
 *    https.createServer({ ... }, app).listen(443);
 *
 * @return {http.Server}
 * @api public
 */

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

또한 socket.io로 작업하려면 예제를 참조하십시오.

참조

나는 선호한다 app.listen():)


9

Express는 기본적으로 개발자가 쉽게 사용할 수 있도록 만들어진 http 모듈 래퍼입니다.

  1. Express를 사용하여 HTTP 요청에 쉽게 응답하도록 미들웨어를 설정할 수 있습니다.
  2. Express를 사용하여 인수를 템플리트에 전달하여 HTML 페이지를 동적으로 렌더링 할 수 있습니다.
  3. 또한 express를 사용하여 라우팅을 쉽게 정의 할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.