ホームページ ウェブフロントエンド jsチュートリアル Node.js Web アプリケーション フレームワーク Express 入門ガイド_JavaScript のヒント

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

May 16, 2016 pm 04:46 PM
express node.js ウェブフレームワーク

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nodeのメモリ制御に関する記事 Nodeのメモリ制御に関する記事 Apr 26, 2023 pm 05:37 PM

ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

Golang の Web フレームワーク Buffalo を使用して Web アプリケーションを構築する Golang の Web フレームワーク Buffalo を使用して Web アプリケーションを構築する Jun 24, 2023 am 10:27 AM

Buffalo は、Golang を使用して開発された Web フレームワークで、Web アプリケーションを迅速に開発するためのソリューションを提供します。この記事では、Buffaloを使ってWebアプリケーションを構築する方法を紹介します。 Buffalo のインストール まず、Buffalo をローカルにインストールする必要があります。 Buffalo は、アプリケーションを構築して実行できる便利なコマンド ライン ツールを提供します。インストールする前に、Golang と Node.js がインストールされていることを確認してください。ラン

Node の File モジュールについて詳しく説明しましょう Node の File モジュールについて詳しく説明しましょう Apr 24, 2023 pm 05:49 PM

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

Go 言語 Web フレームワークの比較: gin vs. echo vs. iris Go 言語 Web フレームワークの比較: gin vs. echo vs. iris Jun 17, 2023 pm 07:44 PM

Web 開発の需要が増加し続けるにつれて、さまざまな言語の Web フレームワークが徐々に多様化しており、Go 言語も例外ではありません。 Go 言語の多数の Web フレームワークの中で、gin、echo、iris は最も人気のある 3 つのフレームワークです。この記事では、プロジェクトに適切なフレームワークを選択できるように、これら 3 つのフレームワークの長所と短所を比較します。 Gingin は、高いパフォーマンスと柔軟性を特徴とする軽量の Web フレームワークです。ミドルウェアとルーティング機能をサポートしているため、RESTful な構築に最適です。

PHP と Slim を使用して軽量の Web フレームワークを実装する方法 PHP と Slim を使用して軽量の Web フレームワークを実装する方法 Jun 25, 2023 pm 01:03 PM

Web フレームワークは、最新の Web アプリケーション開発に不可欠な部分となっており、開発者がアプリケーションをより迅速に作成してデプロイできるインフラストラクチャを提供します。 PHP 開発において、Slim は使いやすさと迅速な開発で知られる軽量の Web フレームワークです。この記事では、PHP と Slim を使用して、シンプルだが強力な Web アプリケーションを作成する方法を説明します。スリムとは何ですか? Slim は、PHP 言語で書かれた軽量の Web フレームワークです。

ノードのバッファーについて詳しく見る ノードのバッファーについて詳しく見る Apr 25, 2023 pm 07:49 PM

当初、JS はブラウザ側でのみ動作していたため、Unicode でエンコードされた文字列の処理は簡単でしたが、バイナリ文字列や非 Unicode エンコード文字列の処理は困難でした。バイナリは、コンピュータのビデオ/オーディオ/プログラム/ネットワーク パッケージの最低レベルのデータ形式です。

プレゼンテーション層の Node.js アプリケーションを効率的に開発する方法について説明する記事 プレゼンテーション層の Node.js アプリケーションを効率的に開発する方法について説明する記事 Apr 17, 2023 pm 07:02 PM

フロントエンド アプリケーション開発に Node.js を使用するにはどうすればよいですか?次の記事では、Node でフロントエンド アプリケーションを開発する方法 (プレゼンテーション層アプリケーションの開発を含む) を紹介します。今日私が共有したソリューションは単純なシナリオ向けであり、フロントエンド開発者がコーディング経験がなくても、Node.js に関する背景知識や専門知識を習得することなく、いくつかの単純なサーバーサイド開発タスクを完了できるようにすることを目的としています。

Express と Laravel の詳細な比較: 最適なフレームワークを選択するには? Express と Laravel の詳細な比較: 最適なフレームワークを選択するには? Mar 09, 2024 pm 01:33 PM

Express と Laravel の詳細な比較: 最適なフレームワークを選択するには?プロジェクトに適したバックエンド フレームワークを選択する場合、Express と Laravel が開発者の間で人気のある 2 つの選択肢であることは間違いありません。 Express は Node.js ベースの軽量フレームワークであり、Laravel は PHP ベースの人気のあるフレームワークです。この記事では、これら 2 つのフレームワークの長所と短所を詳しく比較し、開発者がニーズに最適なフレームワークを選択できるように、具体的なコード例を示します。パフォーマンスとスケーラビリティExpr

See all articles