Nodejs-connect 미들웨어
HTTP
Nodejs 의 고전 httpServer 코드
var http = require('http');
var server = http.createServer(requestHandler);
function requestHandler(req, res) {
res.end('hello visitor!');
}
server.listen(3000);
함수
requestHandler
모든 http 요청 의 응답 함수 입 니 다.즉,모든 요청 은 이 함수 의 처 리 를 거 쳐 모든 요청 의 입구 함수 입 니 다.requestHandler 함 수 를 통 해 우 리 는 간단 한 http 논 리 를 쓸 수 있 습 니 다.예 를 들 어 위의 예,모든 요청 을 되 돌려 줍 니 다.
hello visitor!
。 그러나 우리 의 업무 논 리 는 이렇게 간단 할 수 없다.예 를 들 어 인 터 페 이 스 를 실현 해 야 합 니 다.요청 이 왔 을 때 원본 의 요청 이 요청 체 를 포함 하 는 지 판단 한 다음 에 요청 체 의 id 가 데이터베이스 에 존재 하 는 지 판단 하고 마지막 에 존재 하면 true 로 돌아 가 며 존재 하지 않 으 면 false 로 돌아 갑 니 다.
1. , ;
1. id , ;
1. ;
우리 가 먼저 생각 한 것 은 추출 함수,모든 논리 적 함수,간단 하고 저 결합 유지 보 수 를 실현 합 니 다.
구현 코드:
function parseBody(req, callback) {
// http req body
callback(null, body);
}
function checkIdInDatabase(body, callback) {
// body.id Database ,
callback(null, dbResult);
}
function returnResult(dbResult, res) {
if (dbResult && dbResult.length > 0) {
res.end('true');
} else {
res.end('false')
}
}
function requestHandler(req, res) {
parseBody(req, function(err, body) {
checkIdInDatabase(body, function(err, dbResult) {
returnResult(dbResult, res);
});
});
}
위의 해결 방안 은 세 가지 절 차 를 포함 한 업무 문 제 를 해결 하고 세 가지 가 발생 했다.
});
그리고 세 개. err
처리 가 필요 합 니 다.위의 쓰 기 는 기대 하 는 효 과 를 거 둘 수 있 습 니 다.그러나 업무 논리 가 갈수 록 복잡 해 지면 서 30 개의 리 턴 논리 로 출발 해 30 개가 나 왔 다.
});
및 30 개 .이상더 심각 한 것 은 코드 를 쓸 때 자신 이 쓴 논리 가 30 층 중 어느 층 에 있 는 지 전혀 보이 지 않 고 나타 나 기 쉽다 는 것 이다. 여러 번 되돌아오다 지방 으로 돌아 가 는 것 이 옳지 않다 는 등 문제 가 있다. 피 라 미 드 를 되돌리다. 문제 야.대부분의 학생 들 은 피 라 미 드 를 되 돌 리 는 방법 을 생각 할 수 있 을 것 이다.박 령 의 에서 말 한 세 가지 방법 이다.이 세 가지 방법 에 ES6 에 새로 추 가 된 제 너 레이 터 를 더 해 총 네 가지 해결책 을 열거 했다.
EventProxy —— 이벤트 게시 구독 모드(제4 과 까지)BlueBird —— Promise 방안(제1 7 과 까지)Async —— 비동기 프로 세 스 제어 라 이브 러 리
Generator —— ES6 원생 발생 기이론 적 으로 이 네 가 지 는 모두 피라미드 문 제 를 해결 할 수 있다.커 넥 트 와 익 스프 레 스 는
err
。 비동기 프로 세 스 제어 라 이브 러 리 에 대해 간략하게 소개 하거나 이동@제5 과.비동기 프로 세 스 제어 라 이브 러 리 는 먼저 사용자 에 게 실행 중인 함수 목록 을 전송 하고 funlist 로 기록 하도록 요구 합 니 다.프로 세 스 제어 라 이브 러 리 의 임 무 는 이 함수 들 을 순차 실행 。
콜백 은 순 서 를 제어 하 는 관건 입 니 다.funlist 의 함 수 는 콜백 을 호출 할 때마다 다음 funlist 의 함 수 를 실행 합 니 다.
우 리 는 비슷 한 체인 호출 을 실현 하기 시작 했다.
이름 을 바꾸다 funlist
、 middlewares
이름 을 바꾸다 callback
사 이 즈 는 다음 과 같 습 니 다.var middlewares = [
function fun1(req, res, next) {
parseBody(req, function(err, body) {
if (err) return next(err);
req.body = body;
next();
});
},
function fun2(req, res, next) {
checkIdInDatabase(req.body.id, function(err, rows) {
if (err) return next(err);
res.dbResult = rows;
next();
});
},
function fun3(req, res, next) {
if (res.dbResult && res.dbResult.length > 0) {
res.end('true');
}
else {
res.end('false');
}
next();
}
]
function requestHandler(req, res) {
var i=0;
// middlewares
function next(err) {
if (err) {
return res.end('error:', err.toString());
}
if (i<middlewares.length) {
middlewares[i++](req, res, next);
} else {
return ;
}
}
// middleware
next();
}
위 에 서 는 middlewares+next 로 업무 논 리 를 완성 하 였 습 니 다.
next
미 들 웨 어 스 의 모든 함 수 는 하나 입 니 다.
。 전체적인 사고방식 은:
모든
list 에 저장 하기;. 요청 도착 시
( )
list 의
; Connect 의 실현
Connect 의 사상 은 위 에서 논술 한 사상 과 대체적으로 똑 같 습 니 다.먼저 처리 논 리 를 저장 한 다음 에 순환 적 으로 호출 합 니 다.
Connect 에는 주로 다섯 개의 함수 PS 가 있 습 니 다.Connect 의 핵심 코드 는 200+줄 입 니 다.원본 코드 를 대조 하여 아래 함수 소 개 를 보 는 것 을 권장 합 니 다.
함수 명
역할.
createServer
포장 httpServer 형성 app
listen
감청 포트 함수
use
middlewares 에 비 즈 니스 논리 넣 기
handle
이전 장의 requestHandler 함수 증강 판
call
비 즈 니스 논리의 진정한 집행자
Express
익 스프 레 스 는 커 넥 트 의 업그레이드 버 전 이라는 것 을 모두 가 알 고 있다.
Express 는 Connect 의 업그레이드 버 전 뿐만 아니 라 업무 논리 처리 에 편리 하도록 많은 대상 을 봉인 했다.Express 의 Router 는 Connect 의 업그레이드 버 전 입 니 다.
Express 는 몇 개의 모듈 로 나 눌 수 있 습 니 다.
모듈
묘사 하 다.
router
경로 모듈 은 Connect 업그레이드 버 전 입 니 다.
request
Express 패 키 징 을 거 친 req 대상
response
Express 패 키 징 을 거 친 res 대상
application
app 위의 각종 기본 설정
각 모듈 을 간략하게 소개 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.