>  기사  >  웹 프론트엔드  >  NodeJS 연구 노트 Connect Middleware 모듈 (2)_node.js

NodeJS 연구 노트 Connect Middleware 모듈 (2)_node.js

WBOY
WBOY원래의
2016-05-16 16:17:44845검색

1, 오프닝 분석

안녕하세요 여러분, 오늘의 글은 'Connect' 미들웨어와 관련 보조 미들웨어에 대한 소스코드 분석 시리즈를 주로 다루었습니다.

라는 글도 읽어보셨을 거라 생각합니다.

용법과 목적을 소개하고 있으며, 이 글 역시 제 개인적인 관심에서 나온 글이므로 독자들이 더 깊이 이해할 수 있도록 분석 단계에서 틀린 부분이 있으면 조언 부탁드립니다.

알겠습니다! 평소처럼 요점을 살펴보겠습니다. 먼저 소개 분석과 결합된 예시를 살펴보겠습니다.

코드 복사 코드는 다음과 같습니다.

var connect = require("./lib/connect") ;
var app = connect.createServer() ;
app.use(connect.static(__dirname "/public",{
최대 연령: 0
})) ;
app.use(function(req,res,next){
res.end("Hello World!") ;
})
.듣기(8888) ;

두 번째, 라인별 분석:

(1)의 첫 번째 줄에서는 "connect" 모듈을 소개하고, connect를 통해 http|https 서버를 생성하고, http 서버의 모든 기능을 제공합니다.

"connect" 미들웨어를 사용하면 다양한 방법으로 "서버"를 만들 수 있습니다.

코드 복사 코드는 다음과 같습니다.

var 서버 = connect.createServer(
연결.로거()
, connect.static(__dirname '/public')
) ; // 1
var 앱 = 연결() ;
app.use(함수 (req,res) {
res.end("안녕하세요, 노비타!n") ;
}).listen(8888) ; // 2

그러면 어떻게 진행되나요? 소스 코드를 확인하세요.

코드 복사 코드는 다음과 같습니다.

내보내기 = module.exports = createServer ;
imports.createServer = createServer ;

"createServer"를 전역 "exports"에 마운트한 다음 "createServer" 속성을 확장하고 다시 마운트합니다. 목적은 기본 작성 형식과 호환되는 것입니다.

다양한 방법으로 창작의 목적을 달성해보세요. 이는 일상적인 개발 과정에서 누구나 배울 수 있는 아이디어이기도 합니다.

(2) 두 번째 줄 "connect.createServer"를 살펴보고 다음 소스 코드를 살펴보겠습니다.

코드 복사 코드는 다음과 같습니다.

var HTTPServer = require('./http').Server ,
HTTPSServer = require('./https').Server ;
함수 createServer() {
if ('객체' == 인수 유형[0]) {
새로운 HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));
반환 } 그 밖의 {
새 HTTPServer(Array.prototype.slice.call(arguments)) 반환;
}
};

"HTTPSServer"와 "HTTPServer"는 "HTTPSServer"가 https 메서드를 캡슐화한다는 점을 제외하면 기본적으로 동일합니다. "createServer"를 사용하면 일련의 미들웨어를 전달할 수도 있습니다. 이는 후속 소개와 동일한 효과를 가지지만 루트 디렉터리에만 바인딩될 수 있습니다.

(3), 세 번째 줄 "app.use()"를 계속해서 살펴보고, 수행된 작업은 다음 소스 코드를 살펴보세요.

코드 복사 코드는 다음과 같습니다.

var Server = 내보내기.Server = function HTTPServer(미들웨어) {
This.stack = [];
middleware.forEach(함수(fn){
This.use(fn);
}, 이);
http.Server.call(this, this.handle);
};
/**
  * `http.Server.prototype`에서 상속됩니다.
 */
Server.prototype.__proto__ = http.Server.prototype;

"connect"는 "http 서버"에서 상속된 프로토타입으로, 서버의 requestListener를 사용된 미들웨어로 대체합니다.

"connect.use(route, handler)"를 사용하여 각 경로에 미들웨어를 추가합니다. 이러한 미들웨어 "핸들"은 "요청"이 있을 때마다 "route"에 바인딩되고 "스택"에 저장됩니다. 요청하셨습니다.

이 힙을 탐색하여 "route"에 해당하는 "handle"을 찾고 "handle"을 실행합니다. "handle"이 최종적으로 "next()"를 호출하면 계속해서 다음 일치하는 "handle"을 찾아서 실행합니다.

"핸들"을 캡슐화하면 "연결"을 기반으로 더 많은 "미들웨어"를 추가하기가 쉽습니다.

(4) 마지막으로 "listen(8888)"을 살펴보세요. 어떤 역할을 하나요?

기본 서버 개체를 상속하면 특정 포트에서 수신 대기하는 "수신" 기능이 제공됩니다.

 Server.prototype.__proto__ = http.Server.prototype

다음은 "connect.js"의 전체 소스 코드입니다. 공간을 절약하기 위해 아래와 같이 모든 주석을 삭제했습니다.

추가하자면:

코드 복사 코드는 다음과 같습니다.

fs.readdirSync(__dirname '/middleware').forEach(function(filename){
if (/.js$/.test(파일 이름)) {
var name = filename.substr(0, filename.lastIndexOf('.'));
수출.미들웨어.__defineGetter__(이름, 함수(){
         반품 요구('./middleware/' 이름);
});
}
});

"미들웨어" 개체를 "내보내고" "미들웨어" 개체에 대한 메서드를 루프 정의합니다. 이 방법은 "미들웨어" 폴더에 .js 파일 모듈을 직접 로드하는 것입니다.

용도: "exports.utils.merge(exports,exports.middleware)" 이 문장은 미들웨어의 메소드를 직접 내보냅니다.

세 가지 요약:

(1) 소스 코드의 설계 의도를 이해하면 적용 시 이점을 극대화하는 데 도움이 됩니다.

(2) 소스 코드를 볼 때 문법적인 부분에 주의하기 전에 프로세스를 이해하세요.

(3) 소스 코드의 기발한 구현 아이디어에서 배우되, 지나치게 디자인하지 말고 디자인을 위해 디자인하세요.

(4) 내일부터 관련 미들웨어를 계속 분석해서 업데이트하도록 하겠습니다. . . . . .

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.