1. 설치
다음과 같이 코드를 복사하십시오. $ npm install express
또는 Executable Express (1) 어디서나 설치할 수 있습니다.
다음과 같이 코드를 복사하십시오 :/# 번역기 참고 :이 방법은 적극 권장됩니다.
$ npm install -g Express
2. 빨리 시작하십시오
Express를 시작하는 가장 빠른 방법은 Executable Express (1)를 사용하여 아래와 같이 응용 프로그램을 생성하는 것입니다.
앱 생성 :
코드 사본은 다음과 같습니다.
$ npm install -g Express
$ express /tmp /foo && cd /tmp /foo
종속성 패키지 설치 :
코드 사본은 다음과 같습니다.
$ npm 설치 -D
서버 시작 :
코드 사본은 다음과 같습니다.
$ node app.js
3. 서버를 만듭니다
express.httpserver 인스턴스를 만들려면 CreateServer () 메소드를 호출하십시오. 이 응용 프로그램 예에서는 HTTP 조치 (http 동사)를 기반으로 경로를 정의하여 app.get ()를 예로 들어 보겠습니다.
코드 사본은 다음과 같습니다.
var app = require ( 'express'). createServer ();
app.get ( '/', function (req, res) {
Res.Send ( 'Hello World');
});
App.Listen (3000);
4. HTTPS 서버를 만듭니다
Express.httpsServer 인스턴스를 위와 같이 초기화하십시오. 그런 다음 HTTPS 문서에 언급 된 키, CERT 및 기타 (속성/방법)를 수락하는 구성 객체를 전달합니다.
코드 사본은 다음과 같습니다.
var app = require ( 'express'). createServer ({key : ... ...});
V. 구성
Express는 제품 단계 및 개발 단계와 같은 모든 환경을 지원합니다. 개발자는 configure () 메소드를 사용하여 현재 필요한 환경을 설정할 수 있습니다. configure () 호출에 환경 이름이 포함되어 있지 않으면 모든 환경에서 지정된 콜백에서 실행됩니다.
번역기 주 : App.Configure의 Application.js에 표시된대로 생산/개발/단계와 같은 별칭을 스스로 수행 할 수 있습니다. 실제 사용에 대해서는 다음 예제를 참조하십시오.
다음 예제는 개발 단계에서 DUMPEXECECETIONS (던지기 오류) 만 스택 예외를 반환합니다. 그러나 두 환경 모두에서 Methodoverride 및 Bodyparser를 사용합니다. 프로그램의 경로를로드하는 데 사용할 수있는 app.router의 사용에주의하십시오. 또한이 경로는 App.get (), app.post () 등을 처음으로 호출하여로드됩니다.
코드 사본은 다음과 같습니다.
app.configure (function () {
app.use (express.methodoverride ());
app.use (Express.bodyParser ());
app.use (app.router);
});
app.configure ( '개발', function () {
app.use (express.static (__ dirname + '/public'));
app.use (express.errorHandler ({dumpExceptions : true, showstack : true}));
});
app.configure ( 'production', function () {
var oneyear = 31557600000;
app.use (express.static (__ dirname + '/public', {maxage : oneyear}));
app.use (Express.errorHandler ());
});
유사한 환경의 경우 여러 환경 문자열을 통과 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.configure ( 'stage', 'prod', function () {
// 구성
});
모든 내부 설정 (#)의 경우 Express는 세트 (키 [, val]), enable (key) 및 disable (키) 메소드를 제공합니다.
번역기 참고 : 자세한 내용은 다음을 참조하십시오. application.js app.set.
코드 사본은 다음과 같습니다.
app.configure (function () {
app.set ( 'views', __dirname + '/views');
app.set ( 'views');
// => "/절대/경로/to/views"
app.enable ( '일부 기능');
// 동등한 : app.set ( '일부 기능', true);
app.disable ( '일부 기능');
// 동등한 : app.set ( '일부 기능', false);
app.enabled ( '일부 기능')
// => false
});
환경을 바꾸려면 다음과 같은 NODE_ENV 환경 변수를 설정할 수 있습니다.
코드 사본은 다음과 같습니다.
$ node_env = 생산 노드 app.js
대부분의 캐싱 메커니즘은 제품 단계에서만 켜지 기 때문에 매우 중요합니다.
6. 설정
Express는 다음 바로 가기 설정을 지원합니다 (상자 밖에서).
1. BASEPATH는 Res.Redirect ()의 응용 프로그램 기반 경로에 사용되며 명시 적으로 장착 된 앱을 처리합니다.
2. View보기 기본 루트 디렉토리는 CWD/보기입니다
3. View 엔진 기본보기 엔진 처리 (파일보기)는 접미사를 사용할 필요가 없습니다.
4. View Cache Cache를 활성화합니다 (제품 단계에서 활성화)
5. 문자 변경 인코딩, 기본값은 UTF-8입니다
6. 민감한 경로를 케이스 민감한 경로
7. 스트리트 라우팅이 활성화 된 후 (경로에서) 끝/무시되지 않으면 (번역 참고 : 즉, app.get ( '/sofish') 및 app.get ( '/sofish/')가 다릅니다).
8.JSON 콜백 enable res.send () / res.json () 명시 적 JSONP 지원 (투명 JSONP 지원)
7. 라우팅
Express는 HTTP 동작을 사용하여 일련의 프롬프트 및 표현 라우팅 API를 제공합니다. 예를 들어, /user /12 경로로 계정을 처리하려면 다음과 같이 경로를 정의 할 수 있습니다. 이름 지정된 자리 표시 자와 관련된 값은 Req.Params에 의해 액세스 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.get ( '/user/: id', function (req, res) {
res.send ( 'user' + req.params.id);
});
경로는 내부적으로 정기적으로 컴파일되는 문자열입니다. 예를 들어, /user /: id가 컴파일 될 때, 정규 표현식의 단순화 된 버전은 다음과 같습니다.
코드 사본은 다음과 같습니다.
// 공식 문자열을 수정합니다
// user // ([^//]+) //?/
정기적 인 표현식을 통과하여 복잡한 시나리오에 적용 할 수 있습니다. 문자 그대로 정규 표현식으로 캡처 된 콘텐츠 그룹은 익명이므로 Req.params를 통해 직접 액세스 할 수 있습니다. 따라서 우리가 캡처하는 첫 번째 컨텐츠 세트는 req.params [0]이며, 두 번째 세트는 즉시 req.params [1]가 이어집니다.
코드 사본은 다음과 같습니다.
app.get (/^// users? (? : // (/d+) (? : /./. (/d+))?)?/, function (req, res) {
res.send (req.params);
});
위의 정의 된 경로에 대한 컬 요청 :
코드 사본은 다음과 같습니다.
$ curl http : // dev : 3000/user
[NULL, NULL]
$ curl http : // dev : 3000/사용자
[NULL, NULL]
$ curl http : // dev : 3000/users/1
[ "1", null]
$ curl http : // dev : 3000/users/1..15
[ "1", "15"]
다음은 사용할 수있는 경로와 관련된 경로의 몇 가지 예입니다.
코드 사본은 다음과 같습니다.
"/user/: id"
/사용자/12
"/사용자/: id?"
/사용자/5
/사용자
"/files/*"
/files/jquery.js
/files/javascripts/jquery.js
"/파일/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/user/: id/: 작동?"
/user/1
/user/1/편집
"/products. : format"
/products.json
/products.xml
"/제품. : Format?"
/products.json
/products.xml
/제품
"/user/:id. : format?"
/사용자/12
/user/12.json
예를 들어, Post를 사용하여 JSON 데이터를 보내고 JSON 요청 컨텐츠 (또는 기타 컨텐츠)를 구문 분석하여 데이터를 반환하고 반환 결과를 Req.Body에 저장할 수있는 미들웨어 인 BodyParser를 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
var express = 요구 사항 ( 'Express')
, app = express.createserver ();
app.use (Express.bodyParser ());
app.post ( '/', function (req, res) {
Res.Send (Req.Body);
});
App.Listen (3000);
일반적으로 사용자/: id와 같은 "바보"스타일 자리 표시자를 (이름) 제한없이 사용할 수 있습니다. 그러나 예를 들어, 사용자 ID를 숫자로 제한하려면 /user /: id ([0-9]+)를 사용할 수 있으며, 이는 자리 표시자가 적어도 하나의 숫자 (적응, 일치)를 포함하는 경우에만 적용됩니다.
8. 경로 통과 통과
세 번째 매개 변수 인 Next () 함수를 호출하여 다음 적응 된 경로를 제어 할 수 있습니다. 적응을 찾을 수없는 경우 컨트롤이 연결되도록 다시 전달되며 ()에 추가 된 순서대로 미들웨어가 순서대로 호출됩니다 (). 이 원칙은 또한 동일한 경로에 정의 된 여러 경로에 적용되며, 그 중 하나가 다음 ()을 호출하지 않을 때까지 요청됩니다.
코드 사본은 다음과 같습니다.
app.get ( '/user/: id?', function (req, res, next) {
var id = req.params.id;
if (id) {
// 무언가를합니다
} 또 다른 {
다음();
}
});
app.get ( '/user', function (req, res) {
// 다른 일을합니다
});
App.All () 메소드는 한 번 호출하여 모든 HTTP 작업에 동일한 논리를 쉽게 전송할 수 있습니다. 다음으로 의사 데이터에서 사용자를 추출하여 req.user에 할당합니다.
코드 사본은 다음과 같습니다.
var express = 요구 사항 ( 'Express')
, app = express.createserver ();
var users = [{name : 'tj'}];
app.all ( '/user/: id/: op?', function (req, res, next) {
req.user = user [req.params.id];
if (req.user) {
다음();
} 또 다른 {
다음 (새 오류 ( '사용자를 찾을 수 없음' + req.params.id));
}
});
app.get ( '/user/: id', function (req, res) {
res.send ( '보기' + req.user.name);
});
app.get ( '/user/: id/edit', function (req, res) {
res.send ( '편집' + req.user.name);
});
app.put ( '/user/: id', function (req, res) {
res.send ( '업데이트' + req.user.name);
});
app.get ( '*', function (req, res) {
Res.Send (404, 'What ???');
});
App.Listen (3000);
9. 미들웨어
사용 된 Connect Middleware (속성)에는 일반적으로 Express.Createserver ()로 전달되는 일반 Connect 서버가 동반됩니다. 좋다:
코드 사본은 다음과 같습니다.
var express = 요구 사항 ( 'Express');
var app = express.createserver (
Express.logger ()
, Express.bodyParser ()
);
또한 configure () 블록 내에서 -이 프로그레시브 궁전 (번역기 노트 : 웃음 ^^, 점진적 방식으로)에서는 사용 ()을 편리하게 사용하여 미들웨어를 추가 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.use (express.logger ({format : ': method : url'});
일반적으로 다음과 같은 요구 사항 ( 'Connect')을 사용할 수있는 연결 미들웨어를 사용하십시오.
코드 사본은 다음과 같습니다.
var connect = require ( 'connect');
app.use (connect.logger ());
app.use (connect.bodyparser ());
이것은 어느 정도는 다소 불쾌하기 때문에 이러한 미들웨어 속성을 다시 수출하지만 동일합니다.
코드 사본은 다음과 같습니다.
app.use (Express.Logger ());
app.use (Express.bodyParser ());
미들웨어의 순서는 매우 중요합니다. Connect가 요청을 받으면 CreateServer () 또는 사용 ()로 전달하는 첫 번째 미들웨어에는 세 가지 매개 변수, 요청, 응답 및 콜백 함수 (일반적으로 다음)가 동반됩니다. 다음 ()이 호출되면 두 번째 미들웨어 회전 등이됩니다. 많은 중간 전쟁이 서로 의존하기 때문에 주목할 가치가 있습니다. 예를 들어, MethodoVerride ()는 rq.body 메소드를 쿼리하여 HTTP 메소드 과부하를 감지합니다. 반면에, BodyParser ()는 요청 된 내용을 구문 분석하고이를 Req.Body에 저장합니다. 또 다른 예는 쿠키 구문 분석 및 세션 지원입니다. 먼저 () cookieparser ()를 사용한 다음 세션 ()을 사용해야합니다.
많은 특급 애플리케이션에는 이러한 app.use (app.router) 라인이 포함되어 있으며, 이는 약간 이상하게 보일 수 있습니다. 실제로, 모든 정의 된 라우팅 규칙을 포함하고 기존 URL 요청 및 HTTP 방법을 기반으로 라우팅 검색을 수행하는 미들웨어 기능 일뿐입니다. Express를 사용하면 위치를 결정할 수 있지만 기본적으로 하단에 배치됩니다. 경로의 위치를 변경함으로써 미들웨어의 우선 순위를 변경할 수 있습니다. 예를 들어, Or 또는 정적 파일 서비스가 단일 정적 파일 요청의 다운로드를들을 수 있도록 정적 파일 서비스가 최우선 과제가되기를 원합니다. 이는 다음과 같습니다.
코드 사본은 다음과 같습니다.
app.use (Express.Logger (...));
app.use (Express.bodyParser (...));
app.use (Express.CookieParser (...));
app.use (Express.Session (...));
app.use (app.router);
app.use (Express.static (...));
app.use (Express.errorHandler (...));
먼저 노드의 req.end () 메소드를 포함 할 수있는 logger ()를 추가하여 응답 시간에 대한 데이터를 제공합니다. 요청의 내용은 구문 분석 (데이터가있는 경우)과 쿠키 해상도 및 세션 지원이 이어집니다. 동시에, req.session은 app.router의 경로가 트리거되면 정의됩니다. 현재 다음 ()을 호출하지 않으므로 static () 미들웨어는이 요청에 대해 알지 못합니다. 다음 경로가 정의 된 경우 다양한 상태를 기록하고 다운로드를 거부하며 다운로드 포인트 등을 소비 할 수 있습니다.
코드 사본은 다음과 같습니다.
var downloads = {};
app.use (app.router);
app.use (express.static (__ dirname + '/public'));
app.get ( '/*', function (req, res, next) {
var file = req.params [0];
다운로드 [파일] = 다운로드 [파일] || 0;
다운로드 [파일] ++;
다음();
});
10. 라우팅 미들웨어
라우팅은 라우터 미들웨어를 사용하여 둘 이상의 콜백 함수 (또는 배열)를 메소드로 전달할 수 있습니다. 이 기능은 액세스를 제한하고 라우팅을 통한 데이터 다운로드 등에 매우 유리합니다.
일반적으로 비동기 데이터 검색은 다음 예처럼 보일 수 있습니다. ID 매개 변수를 사용하고 사용자를로드하려고합니다.
코드 사본은 다음과 같습니다.
app.get ( '/user/: id', function (req, res, next) {
loaduser (req.params.id, function (err, user) {
(err) 다음에 반환 (err);
res.send ( '보기 사용자' + user.name);
});
});
건조 원칙을 보장하고 가독성을 향상시키기 위해이 논리를 미들웨어에 적용 할 수 있습니다. 아래와 같이,이 논리를 미들웨어로 추상화하면 라우팅의 단순성을 보장하면서 재사용 할 수 있습니다.
코드 사본은 다음과 같습니다.
함수 loaduser (req, res, next) {
// DB에서 사용자를 가져올 것입니다
var user = user [req.params.id];
if (사용자) {
req.user = 사용자;
다음();
} 또 다른 {
다음 (새 오류 ( '사용자로드 실패' + req.params.id));
}
}
app.get ( '/user/: id', loaduser, function (req, res) {
res.send ( '보기 사용자' + req.user.name);
});
사용자 계정에 대한 액세스를 제한하는 것과 같은 더 깊은 논리 계층에 여러 라우팅을 적용 할 수 있습니다. 다음 예제는 인증을 통과 한 사용자 만 자신의 (그녀) 계정을 편집 할 수 있도록합니다.
코드 사본은 다음과 같습니다.
함수 AndrestrictToself (req, res, next) {
req.authenticatedUser.id == req.user.id
? 다음()
: 다음 (새로운 오류 ( '무단');
}
app.get ( '/user/: id/edit', loaduser, andrestricttoself, function (req, res) {
res.send ( '편집 사용자' + req.user.name);
});
라우팅은 단순한 기능 일 뿐이라는 점을 기억하십시오. 아래 그림과 같이 미들웨어를 반환하는 기능을 정의하여보다 표현적이고 유연한 솔루션을 만들 수 있습니다.
코드 사본은 다음과 같습니다.
기능 andrestrictto (역할) {
return function (req, res, next) {
req.authenticatedUser.role == 역할
? 다음()
: 다음 (새로운 오류 ( '무단');
}
}
app.del ( '/user/: id', loaduser, andrestrictto ( 'admin'), function (req, res) {
res.send ( '삭제 된 사용자' + req.user.name);
});
일반적으로 사용되는 미들웨어 "스택"은 배열 (재귀 적으로 적용)을 통해 전달 될 수 있으며, 이는 어느 정도 혼합되어 일치 할 수 있습니다.
코드 사본은 다음과 같습니다.
var a = [미들웨어 1, 미들웨어 2]
, B = [미들웨어 3, 미들웨어 4]
, all = [a, b];
app.get ( '/foo', a, function () {});
app.get ( '/bar', a, function () {});
app.get ( '/', a, middleware3, middleware4, function () {});
app.get ( '/', a, b, function () {});
app.get ( '/', all, function () {});
이 인스턴스의 전체 코드는 경로 미들웨어 예제 저장소를 참조하십시오.
나머지 라우팅 미들웨어를 "건너 뛰는"여러 번 가질 수 있으며 후속 경로와 계속 일치 할 수 있습니다. 이렇게하려면 'Route'문자열 - Next ( 'Route')와 함께 다음 ()을 호출하면됩니다. 나머지 경로가 요청 된 URL과 일치하지 않으면 Express는 404를 찾을 수 없습니다.
11. HTTP 방법
지금까지 나는 App.get ()에 여러 번 노출되었습니다. 또한 Express는 App.Post (), App.Del () 등과 같은 다른 일반적인 HTTP 작업을 제공합니다.
포스트 사용의 일반적인 예는 양식을 제출하는 것입니다. 다음으로 HTML에 게시 할 양식의 메소드 속성을 간단히 설정하고 아래 정의 된 경로에 제어가 할당됩니다.
코드 사본은 다음과 같습니다.
<form method = "post"action = "/">
<입력 유형 = "text"name = "user [name]" />
<입력 유형 = "text"name = "user [email]" />
<입력 유형 = "제출"값 = "제출" />
</form>
기본적으로 Express는이 요청의 내용을 처리하는 방법을 알지 못하므로 BodyParser Middleware를 추가해야합니다. 이는 Application/X-WWW-Form-urlencoded 및 Application/JSON의 내용을 구문 분석하고 변수를 Req.Body에 저장합니다. 다음 예제와 같이이 미들웨어를 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
app.use (Express.bodyParser ());
다음과 같이, 우리의 경로는 req.body.user 객체에 액세스 할 수 있으며 이름과 이메일이 정의되면이 두 속성이 포함됩니다 (번역 참고 : 양식으로 전송 된 내용이 비어 있지 않은 경우).
코드 사본은 다음과 같습니다.
app.post ( '/', function (req, res) {
Console.log (req.body.user);
res.redirect ( 'back');
});
양식에 넣는 것과 같은 메소드를 사용하려면 _Method라는 숨겨진 입력을 사용할 수 있으며 HTTP 메소드를 수정하는 데 사용할 수 있습니다. 이를 위해서는 먼저 Methodoverride Middleware가 필요합니다.이 중간웨어는 Bodyparser 다음에 나타나야합니다.
코드 사본은 다음과 같습니다.
app.use (Express.bodyParser ());
app.use (express.methodoverride ());
이러한 방법이 기본적으로 소유하지 않는 이유는 무엇입니까? 간단히 말해서, 그것은 Express가 요구하는 완전한 기능에 필요하지 않기 때문입니다. 방법의 사용은 응용 프로그램에 따라 다르고 필요하지 않을 수 있으며 클라이언트는 여전히 Put and Delete와 같은 메소드를 사용할 수 있으며 MethodOverride가 양식에 매우 양호한 솔루션을 제공하기 때문에 직접 사용할 수 있습니다. 다음은 다음과 같은 사용 방법에 대한 시연입니다.
코드 사본은 다음과 같습니다.
<form method = "post"action = "/">
<입력 유형 = "hidden"name = "_ method"value = "put" />
<입력 유형 = "text"name = "user [name]" />
<입력 유형 = "text"name = "user [email]" />
<입력 유형 = "제출"값 = "제출" />
</form>
app.put ( '/', function () {
Console.log (req.body.user);
res.redirect ( 'back');
});
12. 오류 처리
Express는 app.error () 메소드를 제공하여 수신 된 예외가 경로에 던져 지거나 다음 (ERR)로 전달됩니다. 다음 예제는 특정 NotFound 예외를 기반으로 다른 페이지를 처리합니다.
코드 사본은 다음과 같습니다.
함수 notfound (msg) {
this.name = 'notfound';
error.call (this, msg);
error.capturestacktrace (this, arguments.callee);
}
notFound.prototype .__ proto__ = error.prototype;
app.get ( '/404', function (req, res) {
새로운 금지를 던지십시오.
});
app.get ( '/500', function (req, res) {
새로운 오류를 던지십시오 ( '키보드 고양이!');
});
아래에 설명 된대로, 우리는 app.error ()를 여러 번 호출 할 수 있습니다. 여기서는 NotFound 인스턴스를 감지하고 404 페이지를 표시하거나 다음 오류 핸들러로 전달합니다. 이 프로세서는 청취 ()가 들릴 때 라우팅 프로세서 아래에 배치되기 때문에 이러한 프로세서는 어디서나 정의 될 수 있다는 점에 주목할 가치가 있습니다. Configure () 블록 내에서 정의를 통해 환경을 기반으로 다른 예외 처리 방법을 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
app.error (function (err, req, res, next) {
if (err instanceof notfound) {
Res.Render ( '404.jade');
} 또 다른 {
다음 (err);
}
});
단순화를 위해, 여기서 우리는이 데모의 모든 오류가 500이라고 가정하며, 물론 원하는 것을 선택할 수 있습니다. 노드와 같은 파일 시스템으로 시스템 호출을 실행할 때 Enoent가있는 오류를받을 수 있습니다. "오류 핸들러에 사용할 수있는 파일이나 디렉토리가 없거나 필요할 때 지정된 페이지를 표시 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.error (function (err, req, res) {
Res.Render ( '500.jade', {
오류 : err
});
});
우리의 앱은 또한 Connect의 ErrorHandler Middleware를 사용하여 예외를보고 할 수 있습니다. 예를 들어, "개발"환경에서 STDERR 예외를 출력하려면 다음을 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
app.use (Express.errorHandler ({dumpExceptions : true}));
동시에, 개발 단계에서 우리는 ShowStack을 True로 설정할 수있는 멋진 HTML 페이지에 전달하고 던지는 예외를 표시해야 할 수도 있습니다.
코드 사본은 다음과 같습니다.
app.use (express.errorhandler ({showstack : true, dumpExceptions : true}));
ErrorHandler Middleware는 수락 할 때 JSON을 반환 할 수 있습니다. Application/JSON이 존재하며 클라이언트 JavaScript에 크게 의존하는 응용 프로그램을 개발하는 데 매우 유용합니다.
13. 경로 매개 변수 사전 처리
라우팅 매개 변수 사전 처리는 암시 적 데이터로드 및 요청 확인을 통해 프로그램의 가독성을 크게 향상시킬 수 있습니다. 예를 들어, 일반적으로 여러 경로에서 기본 데이터를 지속적으로 얻어야합니다. 예를 들어, /user /: id로 사용자를로드하면 다음을 수행 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.get ( '/user/: userId', function (req, res, next) {
user.get (req.params.userid, function (err, user) {
(err) 다음에 반환 (err);
res.send ( 'user' + user.name);
});
});
전처리를 통해 당사의 매개 변수는 데이터베이스에서 유효성 검사, 제어 및로드 데이터를 수행하는 콜백에 매핑 될 수 있습니다. 다음과 같이, 우리는 매개 변수 이름을 가진 app.param ()을 호출하고 일부 미들웨어에 매핑하기를 희망합니다. 보시다시피, 자리 표시 자 값을 나타내는 ID 매개 변수를 수락합니다. 이를 사용하여 사용자를 평소와 같이로드하고 오류를 처리하고 다음 ()을 호출하여 다음 전처리 또는 라우팅 프로세서에 컨트롤을 넘겨줍니다.
코드 사본은 다음과 같습니다.
app.param ( 'userId', function (req, res, next, id) {
user.get (id, function (err, user) {
(err) 다음에 반환 (err);
if (! user) return next (새 오류 ( '사용자 찾기 실패');
req.user = 사용자;
다음();
});
});
이 작업이 완료되면 위의 내용은 경로의 가독성을 크게 향상시키고 프로그램 전체에서 논리를 쉽게 공유 할 수 있습니다.
코드 사본은 다음과 같습니다.
app.get ( '/user/: userId', function (req, res) {
res.send ( 'user' + req.user.name);
});
14. 처리보기
보기 파일은 <name>. <engine> 형식을 사용합니다. 예를 들어, Layout.ejs는 View System에 요구되도록 지시하고로드 된 모듈은 Exports.compile (str, 옵션) 메소드를 (내보내기) Express에 적응하도록 함수를 반환해야합니다. App.Register ()를 사용 하여이 기본 동작을 변경하여 파일 확장을 특정 엔진에 매핑 할 수 있습니다. 예를 들어, "foo.html"은 EJS에서 처리 할 수 있습니다.
다음 예제는 Jade를 사용하여 Index.html을 처리합니다. 레이아웃 : False를 사용하지 않기 때문에 index.jade가 처리 한 컨텐츠는 Layout.jade의 Body라는 로컬 변수로 전달됩니다.
코드 사본은 다음과 같습니다.
app.get ( '/', function (req, res) {
res.render ( 'index.jade', {제목 : '내 사이트'});
});
새로운 뷰 엔진 설정을 통해 기본 템플릿 엔진을 지정할 수 있습니다. 예를 들어 Jade를 사용할 때 다음과 같이 설정할 수 있습니다.
코드 사본은 다음과 같습니다.
app.set ( '보기 엔진', 'Jade');
이것을 처리 할 수 있습니다.
코드 사본은 다음과 같습니다.
Res.Render ( 'index');
대응 :
코드 사본은 다음과 같습니다.
res.render ( 'index.jade');
View Engine이 설정되면 확장은 선택 사항이지만 일치하는 템플릿 엔진을 혼합 할 수 있습니다.
코드 사본은 다음과 같습니다.
Res.Render ( '다른 페이지 .ejs');
Express는 또한보기 옵션 설정을 제공하며, 예를 들어 레이아웃을 사용하지 않으려면 렌더링 할 때마다보기에 적용됩니다.
코드 사본은 다음과 같습니다.
app.set ( '보기 옵션', {
레이아웃 : 거짓
});
필요할 때 Res.Render () 호출 내부에 과부하 할 수 있습니다.
코드 사본은 다음과 같습니다.
res.render ( 'myview.ejs', {layout : true});
레이아웃을 변경 해야하는 경우 일반적으로 다른 경로를 지정해야합니다. 예를 들어, 뷰 엔진을 Jade로 설정하고 파일의 이름이 ./views/mylayout.jade라는 이름을 지정하면 매개 변수를 간단히 전달할 수 있습니다.
코드 사본은 다음과 같습니다.
res.render ( 'page', {layout : 'mylayout'});
그렇지 않으면 (번역기 주 : 뷰 엔진이 Jade 또는 기타 엔진으로 설정되지 않으면) 확장을 지정해야합니다.
코드 사본은 다음과 같습니다.
res.render ( 'page', {layout : 'mylayout.jade'});
또한 절대 경로가 될 수 있습니다.
코드 사본은 다음과 같습니다.
res.render ( 'page', {layout : __dirname + '/../../mylayout.jade'});
이에 대한 좋은 예가 있습니다 - EJS의 시작 및 닫기 태그를 사용자 정의하십시오.
코드 사본은 다음과 같습니다.
app.set ( '보기 옵션', {
열려 있는: '{{',
닫다: '}}'
})
15. 부품보기
Express의 View System에는 부품 및 컬렉션에 대한 내장 지원이 있으며, 이는 문서 조각을 "미니"뷰로 바꾸는 것과 같습니다. 예를 들어, 주석을 표시하기 위해 반복적으로 렌더링하면 부품 세트를 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
부분적 ( 'comment', {collection : comment});
다른 옵션이나 로컬 변수가 필요하지 않으면 전체 객체를 생략하고 단순히 배열로 전달할 수 있습니다.
코드 사본은 다음과 같습니다.
부분적 ( '의견', 댓글);
사용 중에 구성 요소 세트는 로컬 변수에 대한 "마법"지원을 무료로 제공합니다.
1. FirstinCollection True, 그것이 첫 번째 객체 일 때
2. 컬렉션 객체의 indexincollection
3. Lastincollection true, 그것이 마지막 객체 일 때
4. CollectionLength 길이 수집 객체의 길이
로컬 변수의 전송 (생성)은 우선 순위가 높습니다. 동시에 부모의 견해로 전달 된 지역 변수도 어린이에게도 적합합니다. 예를 들어, 부분 ( '블로그/게시물', 게시물)을 사용하여 블로그 게시물을 렌더링하면 게시물 로컬 변수가 생성됩니다. 이 기능을 호출하는 로컬 변수 사용자가 있으며 블로그/게시물에도 유효합니다. (Translator 's Note : 여기서 부분은 PHP의 포함 메소드와 비슷합니다).
참고 : 부품 수집을주의 깊게 사용하여 길이 100의 부품 컬렉션을 렌더링하는 것은 처리 해야하는 100 개의 뷰에 해당합니다. 간단한 컬렉션의 경우 과도한 오버 헤드를 피하기 위해 구성 요소 수집기를 사용하지 않고 내장을 반복하는 것이 가장 좋습니다.
16. 검색보기
검색보기는 부모보기 (PATH)에 대해 실행됩니다. Views/User/List.jade라는 View 페이지가 있고 부분적 ( 'edit')이 그 안에 쓰여지면 Views/User/edit.jade를로드하고 partial ( '../ messages')에 views/messages.jade를로드합니다.
보기 시스템은 또한 템플릿 인덱싱을 지원하므로보기와 동일한 이름의 디렉토리를 사용할 수 있습니다. 예를 들어, 경로에서 res.render ( '사용자')는 비 뷰/user.jade, 즉보기/사용자/index.jade를 얻습니다. (Translator 's Note : 먼저 <ather>. <engine>의 상황을 처리 한 다음 <ather>/<index. <engine>의 상황을 처리하십시오. 자세한 내용은 View.js.를 참조하십시오).
위의 View Index를 사용할 때는 부분 ( '사용자')을 사용하여보기와 동일한 디렉토리에서 Views/Users/Index.jade를 참조합니다. 동시에보기 시스템은 부분적으로 ( '사용자') 호출하지 않고 인덱스/인덱스를 시도합니다.
17. 템플릿 엔진
다음은 Express에 가장 일반적으로 사용되는 템플릿 엔진입니다.
1.haml : Haml 구현
2. 제이드 : haml.js 후계자
3.ejs : 내장 JavaScript
4. Coffeekup : 커피 스크립트 기반 템플릿
5. JQuery 템플릿
18. 세션 지원
Connect의 세션 미들웨어를 사용하여 세션 지원을 얻을 수 있습니다. 이러한 이유로, 우리는 일반적으로 쿠키 데이터를 req.cookies에 구문 분석하고 저장하는 Cookyeparser Middleware와 함께 서문해야합니다.
코드 사본은 다음과 같습니다.
app.use (Express.CookieParser ());
app.use (express.session ({비밀 : "키보드 고양이"}));
기본적으로 세션 미들웨어는 Connect의 내장 메모리 저장소를 사용하지만 다른 많은 구현이 있습니다. 예를 들어 Connect-Redis는 Redis 세션 스토리지를 제공하며 다음과 같이 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
var redisstore = 요구 ( 'Connect-Redis') (Express);
app.use (Express.CookieParser ());
app.use (express.session ({비밀 : "키보드 고양이", Store : New Redisstore}));
이 시점에서 모든 경로 및 후속 미들웨어에서 REQSESSION 및 REQ.SESSIFESTORE 속성을 사용합니다. 예를 들어 쇼핑 카트에 데이터를 추가하려는 경우 Req.session의 모든 속성은 응답으로 자동으로 저장됩니다.
코드 사본은 다음과 같습니다.
var redisstore = 요구 ( 'Connect-Redis') (Express);
app.use (Express.bodyParser ());
app.use (Express.CookieParser ());
app.use (express.session ({비밀 : "키보드 고양이", Store : New Redisstore}));
app.post ( '/add-to-cart', function (req, res) {
// 하나의 양식을 통해 여러 항목을 게시 할 수 있습니다
// (경우에 따라 BodyParser () 미들웨어가 사용됩니다)
var 항목 = req.body.items;
req.session.items = 항목;
res.redirect ( 'back');
});
app.get ( '/add-to-cart', function (req, res) {
// 반환 할 때 페이지가 /추가됩니다
// req.session.items && req.session.items.length를 확인할 수 있습니다
// 프롬프트를 인쇄합니다
if (req.session.items && req.session.items.length) {
req.notify ( 'info', '당신은 카트에 %s 항목이 있습니다', req.session.items.length);
}
Res.Render ( 'Shopping-Cart');
});
Req.session의 경우 세션#t 자세한 내용은 Connect 세션 문서를 참조하십시오.
19. 업그레이드 가이드
Express 1.x를 사용하는 학생의 경우 더 나은 지원을 위해 2.x로 업그레이드 해야하는 중요한 프로그램이있는 경우 공식 마이그레이션 안내서를 참조하십시오. http://expressjs.com/guide.html#migration-guide를 참조하십시오.