Node.js Web アプリケーション フレームワーク Express 入門ガイド_JavaScript のヒント

WBOY
リリース: 2016-05-16 16:46:36
オリジナル
1146 人が閲覧しました

1. インストール

コードをコピーします コードは次のとおりです:
$ npm install Express

またはどこでも使用可能 実行可能 Express(1) インストール:

コードをコピーします コードは次のとおりです:
# 翻訳注: この方法は強く推奨されます
$ npm install - g Express

2. すぐに始めましょう

Express を使い始める最も早い方法は、次に示すように、実行可能ファイル Express(1) を使用してアプリケーションを生成することです。

アプリを作成します:

コードをコピーします コードは次のとおりです:

$ npm install -gexpress
$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( { key: ... });

5. 構成

Express は、実稼働や開発など、あらゆる環境をサポートします。開発者は、configure() メソッドを使用して、現在必要な環境を設定できます。 configure() の呼び出しに環境名が含まれていない場合は、指定されたコールバックがすべての環境で実行されます。

注釈: application.js の app.configure に示されているように、production /development / stage などのエイリアスを自分で選択できます。実際の使用例は以下を参照してください。

次の例では、開発フェーズ中に 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());
});


同様の環境の場合、複数の環境文字列を渡すことができます:
Copy code コードは次のとおりです:

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

Express は、内部設定 (#) に対して、set(key[, val])、enable(key)、および disable(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 エンジン。デフォルトの View エンジン処理 (View files) では、サフィックスを使用する必要はありません
4.view キャッシュ 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] となり、2 番目のセットは req.params[1] の直後に続きます。

コードをコピー コードは次のとおりです。
app.get(/^/users? (?: /(d )(?:..(d ))?)?/, function(req, res){
res.send(req.params);
});
Curl 上記で定義されたルートのリクエストの場合:

コードをコピー コードは次のとおりです:
$curl http://dev:3000/user
[null,null]
$curl http://dev:3000/users
[null,null]
$curl http://dev:3000/users /1
["1",null]
$curl 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/:operation?"
/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]) を使用します。これは、プレースホルダーに少なくとも 1 つの数字が含まれている場合にのみ有効になります (adaptation 、マッチ)。

8. 追い越しルート制御

3 番目のパラメータである next() 関数を呼び出すことで、次に適応されるルートを制御できます。アダプターが見つからない場合、制御は Connect に戻され、use() に追加された順序でミドルウェアが呼び出されます。同じ原則が、同じパスに定義された複数のルートに適用され、そのうちの 1 つが 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')
、app =express.createServer();

var users = [{ name: '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 サーバーの 1 つに付属しており、express.createServer() に渡されます。例:

コードをコピー コードは次のとおりです。

var Express = require('急行');

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


さらに、configure() ブロック内 - このプログレッシブ進歩的な方法では、use() を使用してミドルウェアを簡単に追加することもできます。
コードをコピー コードは次のとおりです。

app.use(express.logger({形式: ' :メソッド :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() に渡す最初のミドルウェアには、リクエスト、レスポンス、コールバック関数の 3 つのパラメータが含まれます (通常は次)。 next() が呼び出されると、2 番目のミドルウェアの番になり、以下同様に続きます。たとえば、methodOverride() は req.body メソッドをクエリして HTTP メソッドのオーバーロードを検出し、bodyParser() はリクエストの内容を解析して req body に保存するため、これは注目に値します。もう 1 つの例は、Cookie の解析とセッションのサポートです。最初に use()、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 (...));

まず、logger() を追加します。これには、応答時間データを提供するノードの req.end() メソッドが含まれる場合があります。次のリクエストの内容が解析され (データがある場合)、続いて cookie の解析とセッションのサポートが行われます。同時に、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('表示中のユーザー ' 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) {
return function( 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() を呼び出すだけです - next('route')。要求された URL に一致するルートが残っていない場合、Express は 404 Not Found を返します。

11. HTTP メソッド

これまでに何度か app.get() に遭遇しました。さらに、Express は app.post()、app.del() などの他の一般的な HTTP アクションも提供します。

POST の一般的な使用例は、フォームの送信です。次にhtmlで投稿するフォームのmethod属性を設定するだけで、以下に定義したルートに制御が移ります。

コードをコピー コードは次のとおりです:






デフォルトでは、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 メソッドを変更することができます。これを行うには、まず、methodOverride ミドルウェアが必要です。これは、req.body に含まれるフォーム値を使用するために、bodyParser の後に出現する必要があります。
コードをコピー コードは次のとおりです。

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

これらのメソッドがデフォルトで利用できない理由については、単に Express に必要な完全な機能には必要ないからです。メソッドの使用はアプリケーションによって異なりますが、クライアントでは PUT や DELETE などのメソッドを直接使用できます。これは、methodOverride がフォームに非常に優れたソリューションを提供するためです。以下は、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, argument.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() 中にルート ハンドラーの下に配置されるため、どこにでも定義できることに注意してください。これにより、configure() ブロック内で定義できるため、環境に基づいてさまざまな例外処理メソッドを使用できます。
コードをコピー コードは次のとおりです。

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 }));

同時に、開発段階で例外を表示する必要がある場合があります。このために、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);
});
});

前処理により、 we パラメーターは、検証、制御、さらにはデータベースからのデータのロードを実行するコールバックにマップできます。以下のように、パラメータ名を指定して 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( 'failed to find user'));
req.user = user;
next();
});
});

これが完了したら上記により、ルーティングの可読性が大幅に向上し、プログラム全体でロジックを簡単に共有できるようになります:
コードをコピー コードは次のとおりです:

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


14. ビュー処理

ビュー ファイルは、. という形式を使用します。 は必要なモジュールの名前です。たとえば、layout.ejs はビュー システムに require('ejs') を指示し、ロードされたモジュールは、exports.compile(str, options) メソッドを (エクスポート) し、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');

ビュー エンジンが設定されている場合、拡張子はオプションですが、拡張子と拡張子を混在させることもできます。 match テンプレート エンジン:
コードをコピー コードは次のとおりです:

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' });
Otherwise (注釈: いいえ、ビュー エンジンが jade または他のエンジンに設定されている場合)、拡張子を指定する必要があります:

コードをコピーコードは次のとおりです:
res.render('page', {layout: 'mylayout.jade' });
これらは絶対パスにすることもできます:

コードをコピーします コードは次のとおりです:
res.render('page', {layout: __dirname '/../../mylayout.jade ' });
これには良い例があります - ejs の開始タグと終了タグをカスタマイズします:

コードをコピー コードは次のとおりです:
app.set('view options', {
open: '{{',
閉じる: '}}'
})

15. ビューコンポーネント

Express のビュー システムには、パーツとコレクションのサポートが組み込まれています。これは、ドキュメントのフラグメントを「ミニ」ビューに置き換えることと同じです。たとえば、ビューにコメントを繰り返し表示するには、ウィジェット セットを使用できます:


コードをコピー コードは次のとおりです。 :
partial('comment', { collection: comments });
他のオプションやローカル変数が必要ない場合は、オブジェクト全体を省略して、単純に配列と同じです。 上記は同等です:

コードをコピーします コードは次のとおりです:
partial('コメント', コメント);

使用中、ウィジェット セットはいくつかの「マジック」ローカル変数を無料でサポートします。

1.firstInCollection true、最初のオブジェクトの場合
2.indexInCollection コレクター オブジェクトのインデックス
3.lastInCollection true、最後のオブジェクトの場合
4 .collectionLength コレクターの長さオブジェクト

ローカル変数の転送(生成)が優先されます。同時に、親ビューに渡されたローカル変数は子ビューにも適用されます。たとえば、partial('blog/post', post) を使用してブログ投稿をレンダリングすると、この関数を呼び出すビューにローカル変数 user が生成され、これも有効になります。ブログ/投稿用。 (注釈: ここでの部分的は、php の include メソッドに似ています)。

注: 長さ 100 のウィジェット コレクション配列をレンダリングすることは、100 個のビューを処理する必要があることに相当します。単純なコレクションの場合は、過度のオーバーヘッドを避けるために、ウィジェット コレクターを使用するのではなく、組み込みを繰り返すことをお勧めします。

16. 検索を表示

ビューの検索は、親ビュー (パス) に対して相対的に実行されます。たとえば、views/user/list.jade というビュー ページがあり、その中に Partial('edit') が記述されているとします。 view/user/edit.jade をロードします。同様に、partial('../messages') は views/messages.jade をロードします。

View システムはテンプレートのインデックス作成もサポートしているため、ビューと同じ名前のディレクトリを使用できます。たとえば、ルートでは、res.render('users') は views/users.jade (views/users/index.jade) を返します。 (注釈: 最初に . のケースを処理し、次に / のケースを処理します。詳細については、view.js を参照してください。)

上記のビュー インデックスを使用する場合、partial('users') を使用してビューと同じディレクトリにある views/users/index.jade を参照します。同時に、ビュー システムは ../ のインデックスを作成しようとします。ユーザー/インデックス。partial('users') を呼び出す必要はありません。

17. テンプレートエンジン

Express で最も一般的に使用されるテンプレート エンジンは次のとおりです:

1.Haml: haml 実装
2.Jade: haml.js の後継
3.EJS: 埋め込み JavaScript
4.CoffeeKup: CoffeeScript に基づくテンプレート
5.jQuery テンプレート

18. セッションサポート

セッションのサポートは、Connect のセッション ミドルウェアを使用して取得できます。このためには、通常、Cookie データを解析して 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){
// フォームを通じて複数のアイテムを POST する場合があります
// (場合によっては 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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート