Help us understand the problem. What is going on with this article?

express3からexpress4へアップグレードする時のチェックリスト

More than 5 years have passed since last update.
  • 雑にメモります、随時更新中
  • ノウハウや参考記事があれば是非ご紹介ください

app.configure がなくなった

元々存在理由が不明だったやつ。
普通に if (app.get('env') === 'development') 的な条件分岐にする。

express.logger がなくなった

普通は morgan で代替する。

express.bodyParser が変わった

3 系でも非推奨だったので、この記事に含めるには微妙だけどついでに書いておく。

https://github.com/expressjs/body-parser

// extended: true だと 3 系と同じように
// name="foo[x]" value="val" を { foo:{x: "val"} } へ自動で展開する。
// README によると false 推奨っぽいのだが、何故そうなったのかは不明。
app.use(express.bodyParser.urlencoded({extended: true}));

multipart 用のミドルウェアについては、README にあるけど以下のどれかに変更してくれとのこと。

This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:

busboy and connect-busboy
multiparty and connect-multiparty
formidable
multer

所感:

  • miltiparty = 個別のミドルウェアが欲しいなら
  • multer = app.use で一括指定したいなら
  • formidable = フォーム処理的なものも付属している?
  • busboy = 用途が良くわからない、multer が中で使ってる

なお、旧 app.use(express.bodyParser()) も非推奨ログが出るけど動くは動く。

express.csrf がなくなった

替わりに csurf を使う。使い方は全く同じ。

/bin や /public の雛形が出来た

express-generator で生成すると binpublic ディレクトリができている。
今までオレオレ設定が気になっていた人は、このルールに合わせると少し幸せになれます。

$ express express-project 
$ tree express-project 
express-project
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.jade
    ├── index.jade
    └── layout.jade

Router が出来た

http://expressjs.com/api.html#router

未調査だが、ざっと見た感じ

app = express.Router()

で、グローバルに設定した app を返すようになり、各ファイルで

var app = express.Router();
app.get('/', function(req, req, next){});

できるようになっている。

また、子ルーターが設定できるよう? 非常に良い!

var router = express.Router();
router.get('/foo', function(req, req, next){});
router.get('/bar', function(req, req, next){});
// 未検証だけど、これで /calendar/foo と /calendar/bar が設定されるのではないか
app.use('/calendar', router);

app を階層構造で定義できるようになった

Router だけではなく、app そのものも階層構造を持てるようになりました。

var app = express();
app.get('/', ..略..);

var userApp = express();
userApp.get('/create', ..略..);

// '/' と '/user/create' にルーティングされる
app.use('/user', userApp);

// この mountpath のように、
// 階層構造を前提とした各種プロパティも用意されている
console.log(userApp.mountpath);  // -> '/user'

参考リンク

moneyforward
「お金を前へ。人生をもっと前へ。」をMissionとして、個人向け、法人向け様々なFintechサービスを開発、提供しています。
https://moneyforward.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away