読者です 読者をやめる 読者になる 読者になる

expressのapp.use(app.router)

node.js

の意味がいまいちわかってなかった。app.getとかapp.postとかを処理する場所を決めるというやつだった。

app.useは登録した順番で呼ばれるので、app.use(app.router)がないこの例では、foo -> bar -> send('hoge') という順番で呼ばれる。

var express = require('express');
var app = module.exports = express.createServer();

app.use(function(req, res, next) {
  console.log('foo');
  next();
});

app.use(function(req, res, next) {
  console.log('bar');
  next();
});

app.get('/', function(req, res, next) {
  res.send('hoge');
});

app.listen(3000);

一方、app.routerを使うとこうなる。

var express = require('express');
var app = module.exports = express.createServer();

app.use(function(req, res, next) {
  console.log('foo');
  next();
});

// ここで app.get(send('hoge')) が処理される
app.use(app.router);

// app.getでnextが呼ばれてなければここは処理されない
app.use(function(req, res, next) {
  console.log('bar');
  next();
});

app.get('/', function(req, res, next) {
  res.send('hoge');
});

app.listen(3000);

つまりapp.getの位置が変わってこれと等価になるということ。

var express = require('express');
var app = module.exports = express.createServer();

app.use(function(req, res, next) {
  console.log('foo');
  next();
});

app.get('/', function(req, res, next) {
  res.send('hoge');
});

app.use(function(req, res, next) {
  console.log('bar');
  next();
});

app.listen(3000);

コードはこの辺。
https://github.com/visionmedia/express/blob/2.4.3/lib/http.js#L92-96

ドキュメントのこの辺に用途も含めて書いてある。
http://expressjs.com/guide.html#middleware