この記事では主に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/:id がコンパイルされると、内部的にコンパイルされた正規表現文字列は次のようになります (簡略化): コードは次のとおりです:
\/user\/([^\/]+)\/?
より複雑なことを実現するには、正規表現リテラルを渡すことができます。通常のキャプチャ グループは匿名なので、最初のキャプチャ グループは req.params[0 である必要があります。 ]、2 番目は req.params[1] などになります。 app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){
res.send(req.params);
});
$ 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
});
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);
});
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 サイトの他の関連記事を参照してください。