ホームページ  >  記事  >  ウェブフロントエンド  >  NodeJSフレームワークExpressのパスマッピング(ルーティング)機能と制御サンプルコードの詳細説明

NodeJSフレームワークExpressのパスマッピング(ルーティング)機能と制御サンプルコードの詳細説明

黄舟
黄舟オリジナル
2017-03-25 14:55:261202ブラウズ

この記事では主にNodeJSframeworkexpress(routing)の詳細なパスマッピングを紹介します。興味のある方は、この CSSer が NodeJS に基づいた非常に優れたサーバーサイド開発フレームワークであることを知っています。コントロールの章では、ルートはクライアントが要求した URL のパス マッピング機能を実装します。それでも理解できない場合は、この記事を読むと何かが得られると思います

URL).マッピング)

Express は、意味のある表現力豊かな URL マッピング

API

を使用します。たとえば、次の例は、ユーザー アカウントの URL を「/user/12」のように実装できます。このようなルートでは、プレースホルダー識別子 (この場合: id) に関連する値が req.params によって取得できます

app.get('/user/:id', function(req, res){

  res.send('user ' + req.params.id);

});
上記の例では、/user/12 にアクセスすると、「user 12」が返されます。 CSSer. 注: app.get は、get リクエスト イベントをリッスンするためにサーバーにリスナーを登録することと同じであり、次の

コールバック関数

プロセスが非同期で実行されます。たとえば、/user/:id がコンパイルされると、内部的にコンパイルされた正規表現文字列は次のようになります (簡略化): コードは次のとおりです:

\/user\/([^\/]+)\/?

より複雑なことを実現するには、正規表現リテラルを渡すことができます。通常のキャプチャ グループは匿名なので、最初のキャプチャ グループは req.params[0 である必要があります。 ]、2 番目は req.params[1] などになります。

app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){

  res.send(req.params);

});
Linux のcurl コマンドを通じて定義したルートをテストします。

$ curl http://cssercom:3000/user

[null,null]

$ curl http://cssercom:3000/users

[null,null]

$ curl http://cssercom:3000/users/1

["1",null]

$ curl http://cssercom: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 を通じて json データを送信し、bodyParser ミドルウェアを使用して json リクエスト本文を解析し、json データをクライアントに返すことができます:

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 値を渡すことができます。ユーザー ID を数値に制限したい場合は、「/user/:」と書くことができます。 id(d+ )"、これにより、プレースホルダーのデータ型が

数値型

の場合にのみ、ルーティング関連の処理が実行されることが保証されます。

ルーティング制御

アプリケーション内で複数のルートを定義でき、Express には 3 番目のパラメーターである next() 関数が用意されています。パターンが一致しない場合、制御は Connect に戻され (Express は Connect モジュールに基づいています)、ミドルウェアは use() で追加された順序で引き続き実行されます。これは、定義された複数のルートがすべて同じ URL に一致する場合にも当てはまります。ルートが next() を呼び出してクライアントに応答を出力していない限り、それらのルートも順番に実行されます。

app.get('/users/:id?', function(req, res, next){

  var id = req.params.id;

  if (id) {

    // 一回注:如果在这里就将响应内容输出给客户端,那么后续的URL映射将不会被调用

  } else {

    next(); // 将控制转向下一个符合URL的路由

  }

});

 

app.get('/users', function(req, res){

  // do something else

});
app.all() メソッドは、単一の呼び出しエントリをすべての HTTP アクションに適用でき、場合によっては便利です。以下では、この関数を使用して模擬データベースからユーザーをロードし、それを req.user に割り当てます。

var express = require('express')

 , app = express.createServer(); 

var users = [{ name: 'www.csser.com' }];

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('what???', 404);

});
app.listen(3000);

ルート パラメーター

前処理

ルート パラメーターの前処理により、暗黙的なデータ処理を通じてアプリケーション コードの可読性とリクエスト URL の検証が大幅に向上します。 /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() を呼び出し、特定のミドルウェアにマップするパラメーターを渡します。プレースホルダー (:userId) 値を含む 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('CSSer用户为 ' + req.user.name);

});
ルート プレースホルダーの検証や値の強制変更などの単純な状況では、1 つのパラメーターを渡すだけでよく (1 つのパラメーターをサポート)、期間中にスローされた例外は自動的に next(err) に渡されます。

app.param('number', function(n){ return parseInt(n, 10); });

也可以同时将回调函数应用到多个占位符,比如路由/commits/:from-:to来说,:from和:to都是数值类型,我们可以将它们定义为数组

app.param(['from', 'to'], function(n){ return parseInt(n, 10); });

结语

通 过本文的学习,我们应该有些感觉了,NodeJS不仅仅可以实现我们产品的服务端逻辑,同时我们还可以利用Javascript做服务器编程,注意是服务 器,也就是说,我们可以利用Javascript来定制以往只能在apache中才可以做到的功能。NodeJS还需要rewrite吗?路径映射更简单 更强大,还要rewrite干嘛用?

以上がNodeJSフレームワークExpressのパスマッピング(ルーティング)機能と制御サンプルコードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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