nodejsexpress

nodejsとexpressでREST APIっぽいURLでroutingする方法

November 07, 2012

2 min read

mitsuruogMitsuru Ogawa

nodejs で express を使って routing する際に、少し知ってると REST API っぽい URL 設計で routing できるので紹介します。

まず、基本編。

var express = require("express"),
  http = require("http");

var app = express();
app.get("/content/*", function (req, res) {
  console.log(req.params);
  res.send(req.params);
});

http.createServer(app).listen(3000);
console.log("Express server listening on port 3000");

URL とそれを呼び出したときの req.params の内容です。

http://localhost:3000/content/
http://localhost:3000/content/aaaa
http://localhost:3000/content/aaaa/bbbb

[ '' ]
[ 'aaaa' ]
[ 'aaaa/bbbb' ]

次に REST API っぽく。

var express = require("express"),
  http = require("http");

var app = express();
app.get("/products/:id/:operation?", function (req, res) {
  console.log(req.params);
  res.send(req.params);
});

http.createServer(app).listen(3000);
console.log("Express server listening on port 3000");

URL とそれを呼び出したときの req.params の内容です。

http://localhost:3000/products/
http://localhost:3000/products/12
http://localhost:3000/products/12/edit
http://localhost:3000/products/12/delete
http://localhost:3000/products/delete

Cannot GET /products/
[ id: '12', operation: undefined ]
[ id: '12', operation: 'edit' ]
[ id: '12', operation: 'delete' ]
[ id: 'delete', operation: undefined ]

「:id」に req.params[0]が「:operation」に req.params[1]がセットされています。 実際には指定している URL リテラルは、次で出てくるような正規表現に内部でコンパイルされるようです。

最後は URL に正規表現リテラルを指定する場合。

var express = require("express"),
  http = require("http");

var app = express();
app.get(/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/, function (req, res) {
  console.log(req.params);
  res.send(req.params);
});

http.createServer(app).listen(3000);
console.log("Express server listening on port 3000");

URL とそれを呼び出したときの req.params の内容です。

http://localhost:3000/node/
http://localhost:3000/node/10
http://localhost:3000/node/10..100

[ undefined, undefined ]
[ '10', undefined ]
[ '10', '100' ]

こんな感じで正規表現を使うと、ページ指定っぽいこともできます。

URL がばっちり決まると API 作ってるサーバサイドエンジニアもモチベーション上がりますね。(あくまで個人的感想です。)