Express 4 への移行
概説
Express 4 では、Express 3 とは互換性の ない 変更が行われています。つまり、依存関係にある Express のバージョンを更新すると、既存の Express 3 アプリケーションは機能しません。 That means an existing Express 3 app will not work if you update the Express version in its dependencies.
この記事では以下の内容を扱います。
- Express 4 における変更点
- Express 3 アプリケーションを Express 4 に移行する例
- Express 4 アプリケーション・ジェネレーターへのアップグレード
Express 4 における変更点
Express 4 では、いくつかの大きな変更が行われています。
- Changes to Express core and middleware system. The dependencies on Connect and built-in middleware were removed, so you must add middleware yourself.
- ルーティング・システムの変更。
- その他の各種変更。
以下も参照してください。
Express コアおよびミドルウェア・システムの変更
Express 4 は、Connect に依存しなくなり、express.static 関数を除くすべての標準装備ミドルウェアをコアから削除しました。つまり、Express は独立したルーティングおよびミドルウェアの Web フレームワークになり、Express のバージョン管理とリリースはミドルウェア更新の影響を受けません。 This means that
Express is now an independent routing and middleware web framework, and
Express versioning and releases are not affected by middleware updates.
標準装備ミドルウェアがないため、アプリケーションの実行に必要なすべてのミドルウェアを明示的に追加する必要があります。そのためには、単に以下のステップを実行してください。 Simply follow these steps:
- モジュールをインストールします。
npm install --save <module-name> - アプリケーションでモジュールを要求します。
require('module-name') - モジュールの資料に従ってモジュールを使用します。
app.use( ... )
次の表に、Express 3 のミドルウェアと、それぞれに対応する Express 4 のミドルウェアをリストします。
| Express 3 | Express 4 |
|---|---|
express.bodyParser |
body-parser + multer |
express.compress |
compression |
express.cookieSession |
cookie-session |
express.cookieParser |
cookie-parser |
express.logger |
morgan |
express.session |
express-session |
express.favicon |
serve-favicon |
express.responseTime |
response-time |
express.errorHandler |
errorhandler |
express.methodOverride |
method-override |
express.timeout |
connect-timeout |
express.vhost |
vhost |
express.csrf |
csurf |
express.directory |
serve-index |
express.static |
serve-static |
Express 4 のミドルウェアの完全なリストは、ここを参照してください。
ほとんどの場合、旧バージョン 3 のミドルウェアを単に Express 4 のミドルウェアに置き換えるだけですみます。詳細については、GitHub でモジュールの資料を参照してください。 For details, see the module documentation in GitHub.
app.use がパラメーターを受け入れます
バージョン 4 では、変数パラメーターを使用して、ミドルウェア関数がロードされるパスを定義し、ルート・ハンドラーからパラメーターの値を読み取ることができます。 次に例を示します。 For example:
app.use('/book/:id', (req, res, next) => {
console.log('ID:', req.params.id)
next()
})
ルーティング・システム
アプリケーションがルーティング・ミドルウェアを暗黙的にロードするようになったため、router ミドルウェアに関してミドルウェアがロードされる順序を考慮する必要がなくなりました。
ルートの定義方法は変わりませんが、ルーティング・システムには、ルートの編成に役立つ 2 つの新機能があります。
- 新しいメソッド
app.route()は、ルート・パスのチェーン可能なルート・ハンドラーを作成します。 - 新しいクラス
express.Routerは、モジュール式のマウント可能なルート・ハンドラーを作成します。
app.route() メソッド
新しい app.route() メソッドを使用すると、ルート・パスのチェーン可能なルート・ハンドラーを作成できます。パスは単一の場所で指定されるため、モジュール式のルートを作成すると、便利であるほか、冗長性とタイプミスを減らすことができます。ルートについて詳しくは、Router() 資料を参照してください。 Because the path is specified in a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more
information about routes, see Router() documentation.
次に、app.route() 関数を使用して定義された、チェーニングされたルート・ハンドラーの例を示します。
app.route('/book')
.get((req, res) => {
res.send('Get a random book')
})
.post((req, res) => {
res.send('Add a book')
})
.put((req, res) => {
res.send('Update the book')
})
express.Router クラス
ルートの編成に役立つもう 1 つの機能は、新しいクラス express.Router です。これを使用すると、モジュール式のマウント可能なルート・ハンドラーを作成できます。Router インスタンスは、完全なミドルウェアおよびルーティング・システムです。そのため、よく「ミニアプリケーション」と呼ばれます。 A Router instance is a complete middleware and
routing system; for this reason it is often referred to as a “mini-app”.
次の例では、ルーターをモジュールとして作成し、その中にミドルウェアをロードして、いくつかのルートを定義し、それをメインアプリケーションのパスにマウントします。
例えば、アプリケーション・ディレクトリーに次の内容で birds.js というルーター・ファイルを作成します。
var express = require('express')
var router = express.Router()
// middleware specific to this router
router.use((req, res, next) => {
console.log('Time: ', Date.now())
next()
})
// define the home page route
router.get('/', (req, res) => {
res.send('Birds home page')
})
// define the about route
router.get('/about', (req, res) => {
res.send('About birds')
})
module.exports = router
次に、ルーター・モジュールをアプリケーションにロードします。
var birds = require('./birds')
// ...
app.use('/birds', birds)
これで、アプリケーションは、/birds および /birds/about のパスに対する要求を処理できるようになり、ルートに固有の timeLog ミドルウェアを呼び出します。
その他の変更点
次の表に、Express 4 におけるその他の小規模ながらも重要な変更点をリストします。
| オブジェクト | 説明 |
|---|---|
| Node.js | Express 4 には、Node.js 0.10.x 以降が必要です。Node.js 0.8.x に対するサポートは除去されました。 |
|
|
|
|
|
The |
|
|
|
|
|
|
|
|
相対 URL を解決しなくなりました。 |
|
|
以前は配列でしたが、現在ではオブジェクトになりました。 |
|
|
以前は関数でしたが、現在ではオブジェクトになりました。 |
|
|
|
|
|
今後は |
|
|
削除されました。 |
|
|
削除されました。 |
|
|
Functionality is now limited to setting the basic cookie value.
機能が基本的な Cookie 値の設定に限定されるようになりました。機能を追加するには、 |
移行の例
次に、Express 3 アプリケーションを Express 4 に移行する例を示します。
使用しているファイルは、app.js および package.json です。
The files of interest are app.js and package.json.
バージョン 3 アプリケーション
app.js
次の app.js ファイルを使用する Express v.3 アプリケーションがあるとします。
var express = require('express')
var routes = require('./routes')
var user = require('./routes/user')
var http = require('http')
var path = require('path')
var app = express()
// all environments
app.set('port', process.env.PORT || 3000)
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(express.favicon())
app.use(express.logger('dev'))
app.use(express.methodOverride())
app.use(express.session({ secret: 'your secret here' }))
app.use(express.bodyParser())
app.use(app.router)
app.use(express.static(path.join(__dirname, 'public')))
// development only
if (app.get('env') === 'development') {
app.use(express.errorHandler())
}
app.get('/', routes.index)
app.get('/users', user.list)
http.createServer(app).listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
package.json
付随するバージョン 3 の package.json ファイルの内容は次のようになります。
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "3.12.0",
"pug": "*"
}
}
プロセス
移行プロセスを開始するには、次のコマンドを使用して、Express 4 アプリケーションに必要なミドルウェアをインストールし、Express と Pug をそれぞれの最新バージョンに更新します。
$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save
app.js に以下の変更を加えます。
-
標準装備の Express ミドルウェア関数
express.favicon、express.logger、express.methodOverride、express.session、express.bodyParser、およびexpress.errorHandlerはexpressオブジェクトで使用できなくなりました。代わりの関数を手動でインストールして、アプリケーションにロードする必要があります。 You must install their alternatives manually and load them in the app. -
You no longer need to load the
app.routerfunction.app.router関数をロードする必要がなくなりました。この関数は有効な Express 4 アプリケーション・オブジェクトではないため、app.use(app.router);コードを削除してください。 -
ミドルウェア関数が正しい順序でロードされていることを確認してください。つまり、アプリケーション・ルートをロードした後で
errorHandlerをロードしてください。
バージョン 4 アプリケーション
package.json
上記の npm コマンドを実行すると、package.json が次のように更新されます。
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"body-parser": "^1.5.2",
"errorhandler": "^1.1.1",
"express": "^4.8.0",
"express-session": "^1.7.2",
"pug": "^2.0.0",
"method-override": "^2.1.2",
"morgan": "^1.2.2",
"multer": "^0.1.3",
"serve-favicon": "^2.0.1"
}
}
app.js
Then, remove invalid code, load the required middleware, and make other
changes as necessary. The app.js file will look like this:
var http = require('http')
var express = require('express')
var routes = require('./routes')
var user = require('./routes/user')
var path = require('path')
var favicon = require('serve-favicon')
var logger = require('morgan')
var methodOverride = require('method-override')
var session = require('express-session')
var bodyParser = require('body-parser')
var multer = require('multer')
var errorHandler = require('errorhandler')
var app = express()
// all environments
app.set('port', process.env.PORT || 3000)
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(favicon(path.join(__dirname, '/public/favicon.ico')))
app.use(logger('dev'))
app.use(methodOverride())
app.use(session({
resave: true,
saveUninitialized: true,
secret: 'uwotm8'
}))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(multer())
app.use(express.static(path.join(__dirname, 'public')))
app.get('/', routes.index)
app.get('/users', user.list)
// error handling middleware should be loaded after the loading the routes
if (app.get('env') === 'development') {
app.use(errorHandler())
}
var server = http.createServer(app)
server.listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
http モジュール (socket.io/SPDY/HTTPS) を直接処理する必要がある場合を除き、このモジュールをロードする必要はありません。次のようにして、アプリケーションを簡単に開始できます。
app.listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
アプリケーションの実行
これで移行プロセスは完了して、アプリケーションは Express 4 アプリケーションになりました。確認するには、次のコマンドを使用してアプリケーションを開始します。 To confirm, start the app by using the following command:
$ node .
http://localhost:3000 をロードして、Express 4 によってレンダリングされるホーム・ページを確認します。
Express 4 アプリケーション・ジェネレーターへのアップグレード
Express アプリケーションを生成するためのコマンド・ライン・ツールは引き続き express ですが、新規バージョンにアップグレードするには、Express 3 アプリケーション・ジェネレーターをアンインストールしてから、新しい express-generator をインストールする必要があります。
インストール
システムに Express 3 アプリケーション・ジェネレーターがインストールされている場合は、次のようにしてアンインストールする必要があります。
$ npm uninstall -g express
ファイルおよびディレクトリーの特権が構成されている方法によっては、このコマンドを sudo で実行することが必要になる場合があります。
次に、新しいジェネレーターをインストールします。
$ npm install -g express-generator
ファイルおよびディレクトリーの特権が構成されている方法によっては、このコマンドを sudo で実行することが必要になる場合があります。
これで、システム上の express コマンドは Express 4 ジェネレーターに更新されました。
アプリケーション・ジェネレーターの変更
コマンドのオプションと使用法の大部分は以前と同じですが、以下の例外があります。
--sessionsオプションを削除しました。--jshtmlオプションを削除しました。- Hogan.js をサポートするために
--hoganオプションを追加しました。
例
次のコマンドを実行して、Express 4 アプリケーションを作成します。
$ express app4
app4/app.js ファイルの内容を見ると、アプリケーションに必要な (express.static を除く) すべてのミドルウェア関数が独立したモジュールとしてロードされており、router ミドルウェアがアプリケーションに明示的にロードされなくなったことが分かります。
また、app.js ファイルが Node.js モジュールになったことも分かります。対照的に以前はジェネレーターによって生成されるスタンドアロン・モジュールでした。
依存関係をインストールした後、次のコマンドを使用してアプリケーションを開始します。
$ npm start
package.json ファイルで npm start スクリプトを見ると、アプリケーションを開始する実際のコマンドは node ./bin/www であることが分かります。これは、Express 3 では node app.js でした。
Express 4 ジェネレーターによって生成される app.js ファイルが Node.js モジュールになったため、(コードを変更しない限り) アプリケーションとして単独では開始できなくなりました。モジュールを Node.js ファイルにロードして、Node.js ファイルから開始する必要があります。この場合、Node.js ファイルは ./bin/www です。 The module must be loaded in a Node.js file
and started via the Node.js file. The Node.js file is ./bin/www
in this case.
Express アプリケーションの作成またはアプリケーションの開始のために、bin ディレクトリーも、拡張子のない www ファイルも必須ではありません。これらは単にジェネレーターが推奨するものであるため、ニーズに合わせて自由に変更してください。 They are
just suggestions made by the generator, so feel free to modify them to suit your
needs.
www ディレクトリーを削除して、処理を「Express 3 の方法」で実行するには、app.js ファイルの最後にある module.exports = app; という行を削除して、その場所に以下のコードを貼り付けます。
app.set('port', process.env.PORT || 3000)
var server = app.listen(app.get('port'), () => {
debug('Express server listening on port ' + server.address().port)
})
次のコードを使用して debug モジュールを app.js ファイルの先頭にロードしたことを確認します。
var debug = require('debug')('app4')
次に、package.json ファイル内の "start": "node ./bin/www" を "start": "node app.js" に変更します。
You have now moved the functionality of ./bin/www back to
app.js. これで、./bin/www の機能を app.js に戻しました。この変更は推奨されるものではありませんが、この演習により、./bin/www ファイルの仕組みと、app.js ファイルが単独で開始されなくなった理由を理解できます。