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

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 までご連絡ください。
JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

メモ帳++7.3.1

メモ帳++7.3.1

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン