Expressでrouterで正規表現を用いてURLを指定し、そのパラメータを取得する

2014.07.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

node.jsのフレームワークであるexpressを用いることで、
容易にWebアプリケーションの構築を行うことができます。

今回はExpressを用いた際に、router内での正規表現を用いたURLの指定とそのパラメータの取得方法を紹介します。

前提条件

検証した環境は以下の環境になります。

node.js v0.10.26

以下のURL設計でアクセスするものとします。

アクセスURL 内容
/user ユーザー一覧を表示
/user/:id(:idは数字とする。) ユーザー情報表示
/user/regist ユーザー登録

ひな形を作成する

expressでアプリケーションを作成する際に、expressのみをインストールした環境でコマンドを実行しようとするとエラーになる場合があります。

$ express
zsh: command not found: express

これは、expressのひな形生成が別のパッケージになったのが原因です。
ひな形生成のパッケージ名はexpress-generatorになります。

npm install -g express-generator
express -e expressSample
cd expressSample
npm install

routerの実装

ひな形で生成された/router/user.jsをもとに実装を進めていきます。

routes/users.js

var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
  res.send('respond user List');
});
router.get('/:id', function(req, res) {
  res.send('respond user Info userid:' + req.params.id);
});
router.get('/regist', function(req, res) {
  res.send('respond user Regist');
});

module.exports = router;

動作確認

実装した内容を確認します。

$ npm start
(別シェルを立ち上げます。)
$ curl http://localhost:3000/users/
respond user List%
$ curl http://localhost:3000/users/1
respond user Info userid:1%
$ curl http://localhost:3000/users/2
respond user Info userid:2%
$ curl http://localhost:3000/users/3
respond user Info userid:3%
$ curl http://localhost:3000/users/regist
respond user Info userid:regist%

/users/registへのアクセスが/users/:idのアクセスとして処理されています。

正規表現でregistとそれ以外のアクセスを振り分けを行います。

修正

ユーザーのidを正規表現で振り分けを行うように修正します。

routes/users.js

var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
  res.send('respond user List');
});
router.get('/:id(\\d+)', function(req, res) {
  res.send('respond user Info userid:' + req.params.id);
});
router.get('/regist', function(req, res) {
  res.send('respond user Regist');
});

module.exports = router;

修正版動作確認

$ curl http://localhost:3000/users/3
respond user Info userid:3%
$ curl http://localhost:3000/users/regist
respond user Regist%

正しくユーザー表示と登録が振り分けられていることが確認できました。

参考サイト

regex - Regular Expression in Node.js Express Router - Stack Overflow