Node.js의 Connect, Express 및 "미들웨어"란 무엇입니까?


634

JavaScript를 잘 알고 있지만 Node.js 생태계 의이 세 가지 프로젝트가 정확히 무엇을하는지 혼란 스럽습니다 . Rails 'Rack과 같은 것입니까? 누군가 설명해 주시겠습니까?


1
connect를 사용하지는 않았지만 이 페이지 는 Rails 'Rack과 비슷하게 들립니다. Node와 관련하여 미들웨어가 무엇인지 이해하십니까?
매트 볼

솔직히, 내가 원하는만큼. 내가 아는 한 라우팅, gzipping, 헤더, 쿠키와 같은 모든 사전 응용 프로그램을 수행하는 계층입니다. 내가 맞아? 그렇다면 MVC 프레임 워크 내부 (예 : Rails)가 아닌 미들웨어에서 적절한 MVC 컨트롤러 / 액션으로 라우팅하는 방식으로 작동합니까?
tillda


8
이 문서는 귀하의 모든 의심과 답변을 더 많이 지우 게 될 것입니다. 너무 늦었다는 것을 이해합니다. . 또한 Node.js에 대해서도 조금 가르쳐줍니다. http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito 링크가 깨졌습니다.
Mast

답변:


891

[ 업데이트 : 4.0 릴리스부터 Express는 더 이상 Connect를 사용하지 않습니다. 그러나 Express는 여전히 Connect 용으로 작성된 미들웨어와 호환됩니다. 내 원래 답변은 다음과 같습니다.]

Node.js를보고있는 사람들에게는 혼동의 여지가 많기 때문에 이에 대해 물어 보니 기쁩니다. 그것을 설명하는 가장 좋은 방법은 다음과 같습니다.

  • Node.js 자체는 HTTP 모듈을 제공하며 ,이 모듈 은 createServerHTTP 요청에 응답하는 데 사용할 수있는 객체를 메소드가 반환합니다. 해당 객체는 http.Server프로토 타입을 상속합니다 .

  • ConnectcreateServer 는의 확장 버전을 상속하는 객체를 반환하는 메서드 도 제공합니다 http.Server. Connect의 확장 기능은 주로 미들웨어를 쉽게 연결할 수 있도록하기 위해 제공됩니다 . 이것이 Connect가 자신을 "미들웨어 프레임 워크"라고 설명하는 이유이며 종종 Ruby의 랙과 유사합니다.

  • Express 는 Connect의 기능을 http 모듈에 createServer연결합니다 Server. Connect의 프로토 타입 을 확장 하는 방법을 제공합니다 . 따라서 Connect의 모든 기능 뷰 렌더링 및 경로 설명을위한 편리한 DSL이 있습니다. 루비의 시나트라는 좋은 비유입니다.

  • 그리고 더 나아가 Express를 확장하는 다른 프레임 워크가 있습니다! 예를 들어, Zappa 는 CoffeeScript, 서버 측 jQuery 및 테스트에 대한 지원을 통합합니다.

다음은 "미들웨어"의 의미에 대한 구체적인 예입니다. 기본적으로 위의 어느 것도 정적 파일을 제공하지 않습니다. 그러나 connect.static디렉토리를 가리 키도록 구성된 (Connect와 함께 제공되는 미들웨어)를 던지면 서버가 해당 디렉토리의 파일에 대한 액세스를 제공합니다. Express는 Connect의 미들웨어도 제공합니다. express.static와 동일합니다 connect.static. (두 가지 모두 staticProvider최근까지 알려졌습니다 .)

제 생각에는 대부분의 "실제"Node.js 앱이 요즘 Express로 개발되고 있다는 것입니다. 추가 된 기능은 매우 유용하며 원하는 경우 모든 하위 수준 기능이 그대로 있습니다.


130
Connect에 대해 나를 화나게 한 것 중 하나는 문서가 Node가 HTTP 서버 이상이라는 것을 인정하지 않는 것입니다. "Connect는 Node.js의 미들웨어 프레임 워크입니다"– 아니오, "Connect는 Node.js의 HTTP 서버를위한 미들웨어 프레임 워크입니다"
Slim

46
@ slim 너무 많이 읽고 있다고 생각합니다. Connect 제조업체는 탁월한 노드 개발자입니다. 그들은 Node가 HTTP 서버 이상이라는 것을 잘 알고 있습니다. 그러나 그것은 수행 내장 HTTP 서버를, 그리고 연결은 당신이 당신의 Node.js를 응용 프로그램에서 사용할 수있는 미들웨어 프레임 워크입니다.
Trevor Burnham

22
오, 나는 Connect 제작자들이 그것을 잘 알고 있다고 확신합니다. 그들은 노드에 대한 철저한 이해 없이는 그들이 가진 것을 성취 할 수 없었습니다. 그러나 단어의 선택은 신규 이민자들이 노드를 혼란스럽게합니다. 그리고 새로운 이민자에게 연결합니다.
슬림

10
명확하고, 모든 답변이 노력해야하는 것. 훌륭한 작업 트레버.
Mark Essel 11

6
좋은 설명입니다. 이와 같은 답변은 새로운 사람들을 Node.js 생태계로 데려 오는 데 도움이됩니다. Node.js에서 웹 앱 개발에 익숙한 사람들은 Express를 시작해야합니다. 루비 비유를 계속하기 위해 Express는 Sinatra와 비슷합니다. Ajax 클라이언트 측 앱을위한 JSON API를 생성 할 때 특히 좋습니다. 내가 찾은 것 중 하나는 응용 프로그램이 특정 수준의 복잡성에 도달하면 더 많은 Rails와 같은 다른 계층이 필요하다는 것입니다. 나는 이 목적을 위해 Locomotive 에서 일하고 있으며 Express 위에 추가 계층이 있습니다.
Jared Hanson

159

허용 된 답변은 실제로 오래되었습니다 (지금 잘못되었습니다). 다음은 현재 버전의 Connect (3.0) / Express (4.0)를 기반으로 한 정보 (소스 포함)입니다.

Node.js와 함께 제공되는 것

단순히 콜백 (req, res)을 취하는 http / https createServer

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

연결이 추가하는 것

미들웨어 는 기본적으로 애플리케이션 코드와 일부 저수준 API 사이에있는 소프트웨어입니다. Connect는 내장 HTTP 서버 기능을 확장하고 플러그인 프레임 워크를 추가합니다. 플러그인은 미들웨어 역할을하므로 connect는 미들웨어 프레임 워크입니다.

그렇게하는 방법은 매우 간단합니다 ( 사실 코드는 실제로 짧습니다! ). 호출하자마자 다음과 같은 var connect = require('connect'); var app = connect();기능 app을 수행 할 수 있습니다.

  1. 요청을 처리하고 응답을 반환 할 수 있습니다. 기본적 으로이 기능을 사용 하기 때문입니다
  2. 플러그인 을 관리 하는 멤버 함수 .use( source )가 있습니다 ( 이 간단한 코드 행으로 인해 여기에서 제공됨 ).

1) 때문에 다음을 수행 할 수 있습니다.

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

2)와 결합하면 다음을 얻을 수 있습니다.

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect는에 등록 할 수있는 유틸리티 기능을 제공 http하므로을 (를) 호출 할 필요가 없습니다 http.createServer(app). 호출 listen되고 코드는 단순히 새로운 http 서버를 생성하고, 콜백으로 레지스터를 연결하고 인수를에 전달합니다 http.listen. 소스에서

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

그래서 당신은 할 수 있습니다 :

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

http.createServer플러그인 프레임 워크가 위에있는 것은 여전히 ​​오래된 것 입니다.

ExpressJS가 추가하는 것

ExpressJS와 연결은 병렬 프로젝트입니다. 연결은 단지 멋진의와 미들웨어 프레임 워크 use기능. Express는 Connect에 의존하지 않습니다 ( package.json 참조 ). 그러나 연결하는 모든 작업을 수행합니다.

  1. / pair ( source ) createServer를 사용할 수있는 기능 일 뿐이므로 connect 와 같이 등록 할 수 있습니다 .reqres
  2. 미들웨어를 등록하기 위한 사용 기능 .
  3. http로 자신listen등록 하는 유틸리티 함수

connect에서 제공하는 것 (중복을 표현하는 것) 외에도 더 많은 기능이 있습니다. 예 :

  1. 가지고 보기 엔진 지원 .
  2. 라우터에 대한 최상위 동사 (get / post 등)가 있습니다.
  3. 가지고 응용 프로그램 설정 을 지원합니다.

미들웨어가 공유 됨

useExpressJS의 기능 연결 호환되므로 인 미들웨어 공유된다 . 둘 다 미들웨어 프레임 워크이며 Express 는 단순한 미들웨어 프레임 워크 이상을 가지고 있습니다 .

어느 것을 사용해야합니까?

내 의견 : 당신은 자신의 선택을 할 수 있도록 위의 내용을 기반으로합니다.

  • http.createServerconnect / expressjs와 같은 것을 처음부터 작성하는 경우 사용하십시오 .
  • 미들웨어, 테스트 프로토콜 등을 작성하는 경우 connect를 사용하십시오. http.createServer
  • 웹 사이트를 작성하는 경우 ExpressJS를 사용하십시오.

대부분의 사람들은 ExpressJS 만 사용해야합니다.

허용되는 답변에 대해 무엇이 잘못 되었습니까?

이것은 어느 시점에서 사실 이었지만 지금은 잘못되었습니다.

확장 된 버전의 http.Server를 상속합니다.

잘못된. 그것은 확장하지 않으며 당신이 본 것처럼 ... 사용

Express는 Connect가하는 일을 http 모듈에 연결합니다

Express 4.0은 연결에 의존하지도 않습니다. 현재 package.json 종속성 섹션을 참조하십시오.


당신은 당신에게 요청을 처리하고 응답을 반환 할 수있는 능력을 제공하지만 사람들은 Express가 실제로 웹 서버라고 말합니다 ... 나는 혼란 스럽습니다. 응답을 다시 보내려면 웹 서버 기능 (예 : Express)이 필요하지 않습니까?
PositiveGuy

1
좋은 물건 고마워! 매우 도움이됩니다 ... 특히 연결이 실제로 라우팅을 제공하는 것임을 알지 못하고 표현하는 것은 라우팅의 유일한 / 소스 공급자가 아니라는 것을 상속합니다. 그리고 연결 및 표현을 사용해야한다고 가정했기 때문에 결국 유스 케이스가 도움이되지만 실제로 필요한 것은 웹 응용 프로그램을위한 표현이기 때문에 이것이 큰 도움이되었습니다. 둘 다 설치하지 않고 둘 중 하나를 설치합니다!
PositiveGuy

귀하의 답변이 맨 위에 있어야합니다. 내가 받아 들인 대답을 읽을 때 나는 그것을 찬성했다. 그러나 답을 읽은 후 ... naahhh
아룬 Joshla

67

node.js

Node.js는 서버 측을위한 자바 스크립트 모터입니다.
모든 js 기능 외에도 HTTP와 같은 네트워킹 기능과 파일 시스템에 대한 액세스가 포함됩니다.
이는 네트워킹 작업이 브라우저에 의해 독점되는 클라이언트 측 js와 다르며 파일 시스템에 대한 액세스는 보안상의 이유로 금지되어 있습니다.

웹 서버로서의 node.js : express

서버에서 실행되고 HTTP를 이해하고 파일에 액세스 할 수있는 것은 웹 서버처럼 들립니다. 그러나 그것은 하나가 아닙니다.
node.js를 웹 서버처럼 동작하게하려면 프로그래밍해야합니다. 들어오는 HTTP 요청을 처리하고 적절한 응답을 제공하십시오.
이것이 Express의 기능입니다. js에서 웹 서버의 구현입니다.
따라서 웹 사이트를 구현하는 것은 Express 경로를 구성하고 사이트의 특정 기능을 프로그래밍하는 것과 같습니다.

미들웨어 및 연결

페이지 제공에는 많은 작업이 포함됩니다. 이러한 작업 중 다수는 잘 알려져 있으며 매우 일반적이므로 노드의 Connect 모듈 ( 노드에서 실행할 수있는 많은 모듈 중 하나)이 해당 작업을 구현합니다.
현재 인상적인 오퍼링을 참조하십시오.

  • 사용자 정의 형식을 지원하는 로거 요청 로거
  • csrf 사이트 간 요청 위조 방지
  • 압축 Gzip 압축 미들웨어
  • basicAuth 기본 http 인증
  • bodyParser 확장 가능 요청 본문 구문 분석기
  • JSON 응용 프로그램 / json 파서
  • urlencoded 응용 프로그램 / x-www-form-urlencoded 파서
  • multipart multipart / form-data 파서
  • 타임 아웃 요청 타임 아웃
  • cookieParser 쿠키 파서
  • 번들로 제공되는 MemoryStore를 통한 세션 세션 관리 지원
  • cookieSession 쿠키 기반 세션 지원
  • 가짜 HTTP 메서드 지원 재정의
  • responseTime은 응답 시간을 계산하고 X-Response-Time을 통해 노출합니다
  • static () 미들웨어 용 staticCache 메모리 캐시 계층
  • 범위 등을 지원하는 정적 스트리밍 정적 파일 서버
  • 디렉토리 디렉토리 목록 미들웨어
  • 가상 호스트 가상 호스트 하위 도메인 매핑 미들웨어
  • favicon 효율적인 favicon 서버 (기본 아이콘 사용)
  • 제한 요청 기관의 bytesize을 제한
  • 자동 쿼리 문자열 파서 쿼리 , req.query 채우기
  • errorHandler 유연한 오류 처리기

Connect는 프레임 워크이며이를 통해 필요한 (하위) 모듈을 선택할 수 있습니다. 있는 contrib 미들웨어 페이지는 추가의 긴 목록 열거 미들웨어 . Express 자체에는 가장 일반적인 Connect 미들웨어가 제공됩니다.

무엇을해야합니까?

node.js를 설치하십시오.
노드와 함께 제공 NPM노드 패키지 관리자 .
이 명령 npm install -g express은 전 세계적으로 express를 다운로드하여 설치합니다 ( express guide 확인 ). 노드가 아닌 명령 줄에서
실행 express foo하면 foo라는 즉시 실행 가능한 응용 프로그램이 만들어집니다. (새로 생성 된) 디렉토리로 변경하고 명령으로 node로 실행 node <appname>한 다음 열어서 http://localhost:3000확인하십시오. 지금 당신은에 있습니다.


3
좋은 답변 감사합니다. 이것은 모든 블로그 게시물이 놓친 간단한 쓰레기의 종류입니다. 전에 한 번도 해본 적이 없다면 그러나 이미 완료했을 때 간단하지만 처음 시작하는 방법에 대한 실마리는 없습니다! 개발자가 블로그 게시물에서 그것을 간과 할 때 나는 그것을 싫어합니다. 설정을 찾기 위해 다른 블로그 게시물을 찾을 필요가 없습니다. 다른 게시물에 다른 블로그 게시물에 대한 링크를 제공하면 매우 유용하므로 다른 게시물을 찾아 다닐 필요가 없습니다. 사냥 여행을 구 해주세요!
PositiveGuy

3
Express 4.0.0은 sudo npm install -g express-generator를 수행해야 함
mohamed-ibrahim

@getsetbro는 의존성을 설치하기 위해 'npm install'을 의미합니다.
Torsten Barthel

16

Connect는 세션 관리, 인증, 로깅 등과 같은 일반적인 HTTP 서버 기능을위한 "상위 레벨"API를 제공합니다. Express는 고급 (Sinatra와 유사한) 기능을 갖춘 Connect 위에 구축되었습니다.


0

Node.js자체는 HTTP 모듈을 제공하며, createServer 메소드는 HTTP 요청에 응답하는 데 사용할 수있는 오브젝트를 리턴합니다. 해당 객체는 http.Server프로토 타입을 상속합니다 .


0

관련 정보, 특히 Visual Studio IDE 작업에 NTVS를 사용하는 경우. NTVS는 NodeJS 및 Express 도구, 스캐 폴딩, 프로젝트 템플릿을 Visual Studio 2012, 2013에 추가합니다.

또한 "WebServer"로 ExpressJS 또는 Connect를 호출하는 언어가 올바르지 않습니다. 기본 웹 서버를 사용하거나 사용하지 않고 기본 WebServer를 작성할 수 있습니다. 기본 NodeJS 프로그램은 http 모듈을 사용하여 http 요청을 처리 할 수 ​​있으므로 기본적인 웹 서버가됩니다.


0

이름에서 알 수 있듯이 미들웨어는 실제로 미들웨어가 중간에 있습니다. 요청과 응답의 중간 .. 요청, 응답, 고속 서버 가이 그림 에서 익스프레스 응용 프로그램앉아있는 방법 클라이언트에서 요청이 오는 것을 볼 수 있고 익스프레스 서버 서버가 해당 요청을 처리하는 것을 볼 수 있습니다. 이러한 방식으로 전체 고속 서버의 전체 작업을 작은 별도의 작업으로 변환합니다. 미들웨어가 요청과 응답 사이에 어떻게 특정 작업을 수행하고 다음 작업으로 요청을 전달한 서버 부분의 작은 청크 .. 마지막으로 모든 작업 응답이 수행되었습니다. 모든 미들웨어가 요청 오브젝트, 응답 오브젝트 및 다음 요청 기능에 액세스 할 수 있습니다. 응답주기

이것은 미들웨어에 대한 표현 YouTube 비디오에서 미들웨어 를 설명하는 좋은 예입니다.


-7

바보 같은 간단한 대답

Connect 및 Express는 nodejs 용 웹 서버입니다. Apache 및 IIS와 달리 "미들웨어"라고하는 동일한 모듈을 사용할 수 있습니다.

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