>웹 프론트엔드 >JS 튜토리얼 >Node.js 웹 애플리케이션 프레임워크 Express 시작 가이드_Javascript 팁

Node.js 웹 애플리케이션 프레임워크 Express 시작 가이드_Javascript 팁

WBOY
WBOY원래의
2016-05-16 16:46:361168검색

1. 설치

코드 복사 코드는 다음과 같습니다.
$ npm install express

또는 어디서나 사용 가능 Express(1) 설치:

코드 복사 코드는 다음과 같습니다.
# 번역 참고: 이 방법을 적극 권장합니다
$ npm 설치 - g 익스프레스

2. 빨리 시작하세요

express를 시작하는 가장 빠른 방법은 아래와 같이 실행 가능한 express(1)를 사용하여 애플리케이션을 생성하는 것입니다.

앱 만들기:

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

$ npm install -g express
$ express /tmp/foo && cd /tmp/foo

종속성 패키지 설치:
코드 복사 코드는 다음과 같습니다:

$ npm install -d

서버 시작:
코드 복사 코드는 다음과 같습니다.

$ node app.js

3. 서버 생성

express.HTTPServer 인스턴스를 생성하려면 createServer() 메서드를 호출하면 됩니다. 이 애플리케이션 예제에서는 일반적으로 app.get()을 예로 들어 HTTP 작업(HTTP 동사)을 기반으로 라우팅을 정의할 수 있습니다.

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

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

app.get('/', function(req, res){
res.send('hello world');
});

app.listen(3000);

4. HTTPS 서버 생성

위와 같이 express.HTTPSServer 인스턴스를 초기화합니다. 그런 다음 https 문서에 언급된 키, 인증서 및 기타(속성/메서드)를 허용하는 구성 개체를 전달합니다.

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

var app = require('express') .createServer( { 키: ... });

5. 구성

Express는 생산, 개발 등 모든 환경을 지원합니다. 개발자는 구성() 메서드를 사용하여 현재 필요한 환경을 설정할 수 있습니다. 구성() 호출에 환경 이름이 포함되지 않은 경우 모든 환경에서 지정된 콜백이 실행됩니다.

주석: application.js의 app.configure에 표시된 대로 프로덕션/개발/단계와 같은 별칭을 직접 선택할 수 있습니다. 실제 사용법은 아래 예시를 참고하세요.

다음 예제에서는 개발 단계 중에만 dumpExceptions(오류 발생)를 발생시키고 스택 예외를 반환합니다. 그러나 두 환경 모두에서 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('development', 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());
});


유사한 환경의 경우 여러 환경 문자열을 전달할 수 있습니다.
복사 code 코드는 다음과 같습니다.

app.configure('stage', 'prod', function(){
// config
});

모든 내부 설정(#)에 대해 Express는 set(key[, val]), 활성화(key) 및 비활성화(key) 메소드를 제공합니다.

주석: 설정에 대한 자세한 내용은 application.js의 app.set을 참조하세요.

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

app.configure(function(){
app .set('views', __dirname '/views');
app.set('views');
// => "/absolute/path/to/views"

app.enable('some feature');
// 다음과 동일: app.set('some feature', true);

app.disable('some feature');
// 다음과 동일: app.set('some feature', false);

app.enabled('some feature')
// => false
});


환경을 변경하려면 다음과 같이 NODE_ENV 환경 변수를 설정할 수 있습니다. 🎜>
코드 복사 코드는 다음과 같습니다.
$ NODE_ENV=production node app.js
이것은 매우 중요합니다. 왜냐하면 대부분의 캐싱 메커니즘은 생산 단계에서만 활성화되기 때문입니다.

6. 설정

Express는 다음과 같은 기본 설정을 지원합니다.

1.basepath는 마운트된 앱을 명시적으로 처리하는 res.redirect()에 사용되는 애플리케이션의 기본 경로입니다.

2.view View는 CWD/views
3.view 엔진의 기본 루트 디렉터리입니다. 기본 보기 엔진 처리(파일 보기)에는 접미사
를 사용할 필요가 없습니다.
4.view 캐시 보기 캐시 활성화(프로덕션 단계에서 활성화됨)
5.charet 인코딩 변경, 기본값은 utf-8
6.대소문자 구분 경로는 라우팅에서 대소문자를 구분합니다
7.strit 라우팅 활성화한 후(라우팅에서) 후행 /는 무시되지 않습니다(주석: app.get('/sofish ') 및 app.get('/ sofish/')는 다를 것입니다)
8.json 콜백은 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]
$ 컬 http://dev:3000/users
[null,null]
$ 컬 http://dev:3000/users /1
["1",null]
$ 컬 http://dev:3000/users/1..15
["1","15 "]

아래는 사용할 수 있는 경로와 연결된 일부 경로의 인스턴스입니다.
코드 복사 코드는 다음과 같습니다.

"/user/:id"
/user/12

"/users/:id?"
/users/5
/users

"/files/*"
/files/jquery.js
/files/javascripts/jquery.js

"/file/*.*"
/files/jquery.js
/files/javascripts/jquery.js

"/user/:id/:작업?"
/user/1
/user/1/edit

"/products.:format"
/products.json
/products.xml

"/products.:format?"
/products.json
/products.xml
/products

"/user/:id.:format?"
/user/12
/user/12.json


예를 들어 POST를 사용하여 bodyParser를 통해 json 데이터를 보낼 수 있습니다. 미들웨어는 json 요청 콘텐츠(또는 기타 콘텐츠)를 구문 분석하여 데이터를 반환하고 반환 결과를 req.body에 저장할 수 있습니다.
코드 복사 코드는 다음과 같습니다:

var express = require('express')
, app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
res.send(req.body);
});

app.listen(3000);


일반적으로 (이름 지정) 제한이 없는 user/:id와 같은 "어리석은" 자리 표시자를 사용할 수 있습니다. 그러나 예를 들어 사용자 ID를 숫자로만 제한하려면 /user/:id([0-9])를 사용할 수 있습니다. 이는 자리 표시자에 숫자가 하나 이상 포함된 경우에만 적용됩니다(적응, 성냥).

8. 통과경로 통제

세 번째 매개변수인 next() 함수를 호출하여 다음 적응 경로를 제어할 수 있습니다. 어댑터가 발견되지 않으면 제어가 Connect로 다시 전달되고 미들웨어는 use()에 추가된 순서대로 호출됩니다. 동일한 경로에 정의된 여러 경로에도 동일한 원칙이 적용되며, 그 중 하나가 next()를 호출하지 않고 요청에 응답하기로 결정할 때까지 순차적으로 호출됩니다.

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

app.get('/users/: id?' , function(req, res, next){
var id = req.params.id;
if (id) {
          // 뭔가를 하세요
  } else {
        next ();
}
});

app.get('/users', function(req, res){
// 다른 작업 수행
});


app.all() 메서드만 호출하면 됩니다. 한번 모든 HTTP 액션에 동일한 로직을 편리하게 적용해보세요. 아래에서는 이를 사용하여 더미 데이터에서 사용자를 추출하고 이를 req.user에 할당합니다.
코드 복사 코드는 다음과 같습니다.

var express = require('express')
, 앱 = express.createServer();

var users = [{ 이름: 'tj' }];

app.all('/user/:id/:op?', function(req, res, next){
req.user = users[req.params.id];
if (req .user) {
next();
} else {
next(new Error('cannot find user ' req.params.id));
}
});

app.get('/user/:id', function(req, res){
res.send('viewing ' req.user.name);
});

app.get('/user/:id/edit', function(req, res){
res.send('editing ' req.user.name);
});

app.put('/user/:id', function(req, res){
res.send('updating ' req.user.name);
});

app.get('*', function(req, res){
res.send(404, 'what???');
});

app.listen(3000)


9. 미들웨어

일반적으로 사용되는 Connect 미들웨어(속성)는 일반 Connect 서버 중 하나와 함께 사용되며 express.createServer() 에 전달됩니다. 예:

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

var express = require(' 표현하다')

var app = express.createServer(
express.logger()
, express.bodyParser()
);


또한, 구성() 블록 내에서 - 이 프로그레시브 점진적인 방식으로 use()를 사용하여 미들웨어를 쉽게 추가할 수도 있습니다.
코드 복사 코드는 다음과 같습니다.

app.use(express.logger({ 형식: ' :method :url' }));

일반적으로 연결 미들웨어를 사용할 때 다음과 같이 require('connect')를 사용할 수 있습니다.
코드 복사 코드

var connect = require('connect');
app.use(connect.logger());
app.use(connect.bodyParser()) ;

이것은 다소 짜증스럽기 때문에 Express는 이러한 미들웨어 속성이 동일하더라도 다시 내보냅니다.
코드 복사 코드는 다음과 같습니다.

app.use(express.logger());
app.use(express.bodyParser())

미들웨어의 순서는 매우 중요합니다. Connect가 요청을 받으면 실행을 위해 createServer() 또는 use()에 전달하는 첫 번째 미들웨어에는 요청, 응답 및 콜백 함수(일반적으로 다음)가 제공됩니다. next()가 호출되면 두 번째 미들웨어의 차례가 됩니다. 예를 들어, methodOverride()는 HTTP 메서드 오버로드를 감지하기 위해 req.body 메서드를 쿼리하고, bodyParser()는 요청 내용을 구문 분석하여 req body에 저장하기 때문에 이는 주목할 만합니다. 또 다른 예는 쿠키 구문 분석 및 세션 지원입니다. 먼저() cookieParser()를 사용한 다음 session()을 사용해야 합니다.

많은 Express 애플리케이션에는 app.use(app.router)와 같은 줄이 포함되어 있습니다. 이는 다소 이상해 보일 수 있지만 실제로는 정의된 모든 라우팅 규칙을 포함하고 기존 규칙을 기반으로 경로 조회를 수행하는 줄입니다. URL 요청 및 HTTP 메소드. 미들웨어 기능. Express를 사용하면 위치를 결정할 수 있지만 기본적으로 맨 아래에 배치됩니다. 경로의 위치를 ​​변경하여 미들웨어의 우선순위를 변경할 수 있습니다. 예를 들어, next()에 전달된 모든 예외가 이를 통해 처리될 수 있도록 마지막 미들웨어에 대한 오류 보고를 원합니다. 라우터가 단일 정적 파일 요청의 다운로드 수 등을 수신할 수 있도록 서비스 우선순위가 더 낮습니다. 대략 다음과 같습니다.

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

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()를 추가합니다. 다음 요청의 내용이 구문 분석되고(데이터가 있는 경우) 쿠키 구문 분석과 세션 지원이 이어집니다. 동시에 app.router의 경로가 트리거될 때 req.session이 정의됩니다. 현재 next()이므로 static() 미들웨어는 이 요청을 알지 못합니다. 다음 경로가 정의되면 다양한 상태를 기록하고 다운로드를 거부하며 다운로드 포인트를 소비할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

var downloads = {};

app.use(app.router);
app.use(express.static(__dirname '/public'));

app.get('/*', function(req, res, next){
var file = req.params[0];
downloads[file] = downloads[file] || 0;
다운로드[파일] ;
next();
});

10. 라우팅 미들웨어

라우팅은 라우터 미들웨어를 사용하여 두 개 이상의 콜백 함수(또는 배열)를 해당 메서드에 전달할 수 있습니다. 이 기능은 액세스 제한, 라우팅을 통한 데이터 다운로드 등에 유용합니다.

일반적으로 비동기 데이터 검색은 :id 매개변수를 사용하고 사용자를 로드하려고 시도하는 다음 예와 같습니다.

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

app.get('/user/:id', function(req, res, next){
loadUser(req.params.id , function(err, user ){
if (err) return next(err);
res.send('Viewing user ' user.name);
});
});

은 DRY 원칙을 보장하고 가독성을 높이기 위해 미들웨어 내에 이 논리를 적용할 수 있습니다. 아래와 같이 이 로직을 미들웨어로 추상화하면 라우팅을 단순하게 유지하면서 재사용할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

function loadUser(req, res, next) {
// db에서 사용자를 가져옵니다.
var user = users[req.params.id];
if (user ) {
req.user = user;
next();
} else {
next(new Error('사용자를 로드하지 못했습니다. ' req.params.id));
}
}

app.get('/user/:id', loadUser, function(req, res){
res.send('사용자 보기' req.user.name);
});


사용자 계정에 대한 액세스를 제한하는 등 더 깊은 논리에 여러 경로를 순차적으로 적용할 수 있습니다. 아래 예에서는 인증된 사용자만 자신의 계정을 편집할 수 있도록 허용합니다.
코드 복사 코드는 다음과 같습니다.

function andRestrictToSelf(req, res, next) {
req.authenticatedUser.id == req.user.id
? next()
: next(new Error('Unauthorized'));
}

app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){
res.send('사용자 편집 ' req.user.name);
} );


아래 표시된 것처럼 경로는 단순한 함수일 뿐이라는 점을 항상 기억하세요. 미들웨어를 반환하는 함수를 정의하여 보다 표현력이 풍부하고 유연한 솔루션을 만들 수 있습니다.
코드 복사 코드는 다음과 같습니다.

function andRestrictTo(role) {
반환 함수( req, res, next) {
req.authenticatedUser.role == role
? next()
: next(new Error('Unauthorized'));
}
}

app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
res.send('삭제된 사용자 ' req.user.name);
});


일반적으로 사용되는 미들웨어 "스택"은 배열을 통해 전달될 수 있으며(재귀적으로 적용됨), 이는 임의의 레벨로 혼합 및 일치될 수 있습니다(어느 정도까지 혼합 및 일치 가능). .
코드 복사 코드는 다음과 같습니다.

var a = [middleware1, middleware2]
, b = [미들웨어3, 미들웨어4]
, 모두 = [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'))을 사용하여 next()를 호출하면 됩니다. 요청한 URL과 일치하는 경로가 남아 있지 않으면 Express는 404 Not Found를 반환합니다.

11. HTTP 방식

지금까지 app.get()을 여러 번 접했습니다. 또한 Express는 app.post(), app.del() 등과 같은 다른 일반적인 HTTP 작업도 제공합니다.

POST 사용의 일반적인 예는 양식을 제출하는 것입니다. 다음으로 HTML로 게시할 양식의 메소드 속성을 설정하면 아래에 정의된 경로에 제어가 할당됩니다.

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






기본적으로 Express는 이 요청의 콘텐츠를 처리하는 방법을 모르므로 bodyParser 미들웨어를 추가해야 하며, 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');
});

뭔가를 사용하고 싶을 때 양식의 PUT과 같은 방식으로 _method라는 숨겨진 입력을 사용할 수 있으며, 이는 HTTP 메서드를 수정하는 데 사용할 수 있습니다. 이를 위해서는 먼저 req.body에 포함된 양식 값을 사용하기 위해 bodyParser 뒤에 나타나야 하는 methodOverride 미들웨어가 필요합니다.
코드 복사 코드는 다음과 같습니다.

app.use(express.bodyParser() );
app.use(express.methodOverride());

이러한 메서드를 기본적으로 사용할 수 없는 이유는 단순히 Express에서 요구하는 전체 기능에 필요하지 않기 때문입니다. 메소드 사용은 애플리케이션에 따라 다릅니다. methodOverride가 양식에 매우 적합한 솔루션을 제공하므로 클라이언트는 여전히 PUT 및 DELETE와 같은 메소드를 사용할 수 있습니다. 다음은 PUT 메소드를 사용하는 방법을 보여줍니다.
코드 복사 코드는 다음과 같습니다.






app.put('/', function(){
console.log(req.body.user);
res.redirect('back');
});

12. 오류 처리

Express는 수신된 예외를 경로에서 발생시키거나 next(err)로 전달할 수 있도록 app.error() 메서드를 제공합니다. 다음 예에서는 특정 NotFound 예외를 기반으로 다양한 페이지를 처리합니다.

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

function NotFound(msg){
this.name = 'NotFound';
Error.call(this, msg);
Error.captureStackTrace(this, 인수.callee);
}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){
throw new NotFound;
});

app.get('/500', function(req, res){
throw new Error('keyboard cat!');
});


다음과 같이 할 수 있습니다. app.error()를 여러 번 호출합니다. 여기서는 NotFound 인스턴스를 감지하고 404 페이지를 표시하거나 다음 오류 처리기로 전달합니다. 이러한 핸들러는 Listen() 중에 경로 핸들러 아래에 배치되므로 어디에서나 정의할 수 있다는 점은 주목할 가치가 있습니다. 환경에 따라 다양한 예외 처리 방법을 사용할 수 있도록 구성() 블록 내에서 정의를 허용합니다.
코드 복사 코드는 다음과 같습니다.

app.error(function(err, req , res, next){
if (err instanceof NotFound) {
res.render('404.jade');
} else {
next(err);
}
}) ;

단순화를 위해 여기서는 이 데모의 모든 오류가 500이라고 가정합니다. 물론 원하는 것을 선택할 수 있습니다. 노드가 파일 시스템에서 시스템 호출을 실행할 때 ENOENT와 함께 error.code를 수신할 수 있습니다. 이는 "해당 파일이나 디렉터리가 없습니다" 오류를 의미하며, 오류 처리기에서 사용할 수 있습니다. 또는 지정된 페이지가 있을 때 사용할 수 있습니다. 필요할 때 표시됩니다.
코드 복사 코드는 다음과 같습니다.

app.error(function(err, req , res) {
res.render('500.jade', {
오류: err
});
});

우리 앱은 Connect의 errorHandler 미들웨어를 사용하여 예외를 보고할 수도 있습니다. 예를 들어, "개발" 환경에서 stderr 예외를 출력하려는 ​​경우 다음을 사용할 수 있습니다.

app.use(express.errorHandler({ dumpExceptions: true }));

동시에 개발 단계에서 예외를 표시해야 할 수도 있습니다. 이를 위해 멋진 HTML 페이지를 전달하고 던집니다. 이를 위해 showStack을 true로 설정할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

app.use(express.errorHandler({ showStack: true , dumpExceptions: true }));

errorHandler 미들웨어는 Accept: application/json이 존재할 때 json을 반환할 수도 있습니다. 이는 클라이언트 측 Javascript에 크게 의존하는 애플리케이션을 개발하는 데 매우 유용합니다.

13. 경로 매개변수 전처리

암시적 데이터 로드 및 요청 확인을 통해 경로 매개변수 전처리를 통해 프로그램의 가독성을 크게 향상시킬 수 있습니다. 예를 들어 여러 경로에서 기본 데이터를 지속적으로 가져와야 하는 경우가 많습니다. /user/:id로 사용자를 로드하는 것처럼 일반적으로 다음과 같이 수행할 수 있습니다.

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

app.get('/user/:userId', function(req, res, next){
User.get(req.params.userId, function(err, user) {
if (err) return next(err);
res.send('user ' user.name);
});
})

전처리를 통해, 우리의 매개변수는 검증, 제어를 수행하거나 데이터베이스에서 데이터를 로드하는 콜백에 매핑될 수 있습니다. 다음과 같이 매개변수 이름을 사용하여 app.param()을 호출하여 이를 일부 미들웨어에 매핑하려고 합니다. 보시다시피, 자리표시자 값을 나타내는 id 매개변수를 허용합니다. 이를 사용하여 사용자를 로드하고 오류를 정상적으로 처리하며 간단히 next()를 호출하여 다음 전처리기 또는 경로 처리기로 제어를 전달합니다.
코드 복사 코드는 다음과 같습니다.

app.param('userId', function (req, res, next, id){
User.get(id, function(err, user){
if (err) return next(err);
if (!user) return next( new Error( '사용자를 찾지 못했습니다'));
req.user = user;
next();
});
});

이 작업이 완료되면 , 위의 내용은 라우팅의 가독성을 크게 향상시키고 프로그램 전체에서 로직을 쉽게 공유할 수 있게 해줍니다.
코드 복사 코드는 다음과 같습니다. :

app.get('/user/:userId', function(req, res){
res.send('user ' req.user.name);
} );


14. 처리 보기

보기 파일은 . 형식을 사용합니다. 여기서 은 필수 모듈의 이름입니다. 예를 들어, 레이아웃.ejs는 뷰 시스템에 require('ejs')를 지시하고, 로드된 모듈은 내보내기.compile(str, 옵션) 메소드를 내보내고(내보내고) Express를 수용할 수 있는 함수를 반환해야 합니다. app.register()를 사용하면 이 기본 동작을 변경하고 파일 확장자를 특정 엔진에 매핑할 수 있습니다. 예를 들어 "foo.html"은 ejs로 처리될 수 있습니다.

다음 예에서는 Jade를 사용하여 index.html을 처리합니다. 우리는layout:false를 사용하지 않기 때문에 index.jade에 의해 처리된 콘텐츠는layout.jade에 있는 body라는 지역 변수로 전달됩니다.

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

app.get('/', function (req, res){
res.render('index.jade', { title: 'My Site' });
});

새 보기 엔진 설정을 사용하면 다음을 지정할 수 있습니다. 예를 들어 jade를 사용하는 경우 기본 템플릿 엔진을 다음과 같이 설정할 수 있습니다.
코드 복사 코드는 다음과 같습니다. 다음은 다음과 같습니다.

app .set('view Engine', 'jade');

을 사용하면 다음을 수행할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

res.render('index');

해당 항목:
코드 복사 코드는 다음과 같습니다:

res.render('index.jade');

뷰 엔진이 설정되면 확장자는 선택 사항이지만 여전히 혼합하여 사용할 수 있습니다. 일치 템플릿 엔진:
코드 복사 코드는 다음과 같습니다:

res.render(' another-page.ejs');

Express는 뷰가 렌더링될 때마다 적용되는 뷰 옵션 설정도 제공합니다. 예를 들어 레이아웃을 사용하지 않으려면 다음과 같이 할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

app.set('view options', {
레이아웃: false
});

필요할 때 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', { 레이아웃: __dirname '/../../mylayout.jade ' });

ejs의 열기 및 닫기 태그를 사용자 정의하는 좋은 예가 있습니다.
코드 복사 코드는 다음과 같습니다.

app.set('view options', {
open: '{{',
닫기: '}}'
})

15. 구성 요소 보기

Express의 보기 시스템에는 부분 및 컬렉션에 대한 지원이 내장되어 있습니다. 이는 문서 조각을 "미니" 보기로 바꾸는 것과 같습니다. 예를 들어 뷰에 댓글을 반복적으로 표시하려면 위젯 세트를 사용할 수 있습니다.

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

partial('comment', { collection: comments });

다른 옵션이나 지역 변수가 필요하지 않으면 전체 개체를 생략하고 간단히 위의 내용은 동일합니다:
코드 복사 코드는 다음과 같습니다.

부분('댓글', 댓글);

사용 중 위젯 세트는 일부 "마법의" 지역 변수를 무료로 지원합니다.

1.firstInCollection true, 첫 번째 객체인 경우
2.indexInCollection index in Collector 객체
3.lastInCollection true, 마지막 객체인 경우
4 .collectionLength Collector의 길이 객체

로컬 변수의 전송(생성)은 동시에 상위 뷰에 전달된 로컬 변수도 하위 뷰에 적용됩니다. 예를 들어, 블로그 게시물을 렌더링하기 위해 부분('blog/post', post)을 사용하면 게시물 로컬 변수가 생성됩니다. 뷰에 이 함수를 호출하는 로컬 변수 user가 있으며 이 변수도 유효합니다. 블로그/포스트용. (주석: 여기서 부분은 PHP의 include 메소드와 더 비슷합니다).

참고: 위젯 컬렉터를 주의해서 사용하세요. 길이가 100인 위젯 컬렉션 배열을 렌더링하는 것은 100개의 뷰를 처리해야 하는 것과 같습니다. 간단한 컬렉션의 경우 과도한 오버헤드를 피하기 위해 위젯 컬렉터를 사용하는 것보다 내장된 것을 반복하는 것이 좋습니다.

16. 검색보기

뷰 검색은 상위 뷰(경로)를 기준으로 수행됩니다. 예를 들어 views/user/list.jade라는 뷰 페이지가 있고 그 안에 부분('edit')이 기록되어 있으면 다음을 시도합니다. views/user/edit.jade를 로드합니다. 마찬가지로 부분('../messages')은 views/messages.jade를 로드합니다.

뷰 시스템은 템플릿 인덱싱도 지원하므로 뷰와 동일한 이름의 디렉터리를 사용할 수 있습니다. 예를 들어 경로에서 res.render('users')는 views/users/index.jade인 views/users.jade를 반환합니다. (주석: 먼저 . 사례를 처리한 다음 / 사례를 처리합니다. 자세한 내용은 view.js를 참조하세요.)

위 뷰 인덱스를 사용할 때 부분('users')을 사용하여 뷰와 동일한 디렉터리에 있는 views/users/index.jade를 참조하는 동시에 뷰 시스템은 ../를 인덱스하려고 합니다. users/index.partial('users')를 호출하지 않고.

17. 템플릿 엔진

다음은 Express에 가장 일반적으로 사용되는 템플릿 엔진입니다.

1.Haml: haml 구현
2.Jade: haml.js 후속 버전
3.EJS: 내장형 JavaScript
4.CoffeeKup: CoffeeScript 기반 템플릿
5.jQuery 템플릿

18. 세션 지원

Connect의 세션 미들웨어를 사용하여 세션 지원을 얻을 수 있습니다. 이를 위해서는 일반적으로 req.cookies에 쿠키 데이터를 구문 분석하고 저장하는 cookieParser 미들웨어를 추가해야 합니다.

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

app.use(express.cookieParser() );
app.use(express.session({ secret: "keyboard cat" }));

기본적으로 세션 미들웨어는 Connect의 내장 메모리 저장소를 사용하지만 다른 구현도 많이 있습니다. . 예를 들어 connect-redis는 다음과 같이 사용할 수 있는 Redis 세션 저장소를 제공합니다.
코드 복사 코드는 다음과 같습니다. :

var RedisStore = require('connect-redis')(express);
app.use(express.cookieParser());
app.use(express.session( { secret: "keyboard cat", store: new RedisStore }));

이 시점에서 req.session 및 req.sessionStore 속성은 모든 경로 및 후속 미들웨어에서 사용할 수 있습니다. req.session의 모든 속성은 예를 들어 장바구니에 데이터를 추가하려는 경우 응답에 자동으로 저장됩니다.
코드 복사 코드는 다음과 같습니다.

var RedisStore = require('connect-redis')(express);
app.use(express.bodyParser());
app .use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));

app.post('/add-to-cart', function(req, res){
// 양식을 통해 여러 항목을 게시할 수 있습니다
// (경우에 따라 bodyParser() 사용 미들웨어 )
var items = req.body.items;
req.session.items = items;
res.redirect('back');
});

app.get('/add-to-cart', function(req, res){
// 반환되면 페이지가 GET /add-to-cart
// 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에는 세션을 유지하고 운영하기 위한 Session#touch(), Session#destroy(), Session#regenerate() 등의 메소드도 있습니다. 자세한 내용은 연결 세션 설명서를 참조하세요.

19. 업그레이드 안내

Express 1.x를 사용하는 학생의 경우, 더 나은 지원을 위해 2.x로 업그레이드해야 하는 중요한 프로그램이 있는 경우 매우 자세한 공식 마이그레이션 가이드를 참조하세요. : http:/ /expressjs. com/guide.html#migration-guide

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